【问题标题】:Issues with os.listdir when script is an executable当脚本是可执行文件时 os.listdir 的问题
【发布时间】:2020-12-30 17:50:41
【问题描述】:

我创建了一个脚本,它从一个文件夹中获取一个文件并在另一个文件夹中生成另一个文件。这是一个将一种格式转换为另一种格式的项目,供没有强大信息学背景的人使用,因此我创建了一个包含脚本的文件夹以及输入文件夹和输出文件夹。用户只需要将输入文件放在输入文件夹中,然后从输出文件夹中取出结果即可。

如果我在使用可视代码运行此 python 脚本以及如果我使用终端 (python CSVtoVCFv3.py) 运行该脚本,则该脚本工作正常

但是当我使用 pyinstaller 将脚本转换为可执行文件时,我发现了下一个错误。

 File "CSVtoVCFv3.py", line 99, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/Users/manoldominguez/input/'
[99327] Failed to execute script CSVtoVCFv3

第99行使用的代码是:


97 actual_path = os.getcwd()
98 folder_input = '/input/'
99 input_file_name = os.listdir(actual_path+folder_input)
100 input_file_name= ''.join(input_file_name)
101 CSV_input = actual_path+folder_input+input_file_name

我也试过这个:

actual_path = (os.path.dirname(os.path.realpath('CSVtoVCFv3.py')))

据我所知,问题的结论是:

在这些行中,如果我运行我的脚本,我会得到这个

'/Users/manoldominguez/Desktop/CSVtoVCF/input/'

如果我的脚本与我的可执行文件一起运行,我会得到这个

'/Users/manoldominguez/input/'

【问题讨论】:

  • 这看起来像是 Python 编程问题,而不是 Unix/Linux 问题。无论如何,检查os.getcwd() 的结果以及如何调用python 程序。
  • 感谢 Eduardo os.getcwd() 还给我 '/Users/manoldominguez/Desktop/CSVtoVCF'
  • 谢谢ajgringo619。我会的。
  • 考虑使用os.path.join()而不是连接字符串
  • 而是os.path.dirname(os.path.realpath(__file__))os.path.dirname(os.path.realpath(sys.argv))

标签: shell executable


【解决方案1】:

os.getcwd() 给出Current Working Directory - 它表示执行脚本的文件夹,但不一定是保存脚本的文件夹。这样您就可以在不同的文件夹中运行代码,并且它可以与不同文件夹中的文件一起使用 - 这很有用。

但是如果你需要在你有脚本的文件夹中使用文件,那么你可以使用

SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__))

import sys

SCRIPT_PATH = os.path.dirname(os.path.realpath(sys.argv[0]))

不是'CSVtoVCFv3.py'

然后你就可以加入了

 SCRIPT_PATH = os.path.dirname(os.path.realpath(sys.argv[0]))

 folder_input = '/input/'

 full_folder_input = os.path.join(SCRIPT_PATH, folder_input)

 all_filenames = os.listdir(full_folder_input)

 for input_file_name in all_filenames:
     #CSV_input = os.path.join(full_folder_input, input_file_name)
     CSV_input = os.path.join(SCRIPT_PATH, folder_input, input_file_name)

我只是不喜欢你

 input_file_name = os.listdir(actual_path+folder_input)
 input_file_name= ''.join(input_file_name)

因为listdir() 可能会提供更多文件,然后您的join 可能会创建不正确的路径。最好为单个文件获取 input_file_name[0] 或使用 for-loop 处理文件夹中的所有文件。


顺便说一句:也许你应该使用sys.argv 来获取路径作为参数,然后每个人都可以决定将文件放在哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多