首页 > 解决方案 > 当脚本是可执行文件时 os.listdir 的问题

问题描述

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

如果我在使用可视代码运行时运行此 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/'

标签: shellexecutable

解决方案


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获取路径作为参数,然后每个人都可以决定将文件放在哪里。


推荐阅读