这是我的代码,我们称之为“example.py”
import traceback
import sys
import os
import linecache
try:
data_files = [x[2] for x in os.walk(os.path.dirname(sys.argv[0]))]
fileNameList = data_files[0] # gets the list of files in the directory where example.py is present
execfile("sample.py")
except:
当我通过IDLE运行它时,这个程序运行得很好但是当我通过命令行运行它时给出了以下错误
Traceback (most recent call last):
File "example.py", line 15, in <module>
fileNameList = data_files[0]
IndexError: list index out of range
我只能假设它无法从命令行获取文件夹中的文件列表,我是python编程的新手,所以如果有人可以解决这个或至少我错的地方,我会非常感激
答案 0 :(得分:2)
你应该这样做:
data_files = [x[2] for x in os.walk(os.getcwd())]
问题在于,当您从命令行运行它时sys.argv[0]
只是您用来调用文件的名称(example.py
),不是完整的绝对路径到文件(这是IDLE使用的)。因此,os.path.dirname
将无法获得任何内容。
请注意,如果您从其他目录运行该文件,例如:
python ../my_examples/example.py
此脚本将遍历当前所在的目录,不 example.py
所在的目录。如果要使用目录{{ 1}},你可以这样做:
example.py
答案 1 :(得分:2)
我认为问题是这样的:当您从IDLE sys.argv[0]
运行时,它保存了脚本的完整路径,因此os.path.dirname()
正确地提取了dirname。但是当你从命令行运行时,sys.argv[0]
只保存脚本名称,如example.py
,而不是路径,因此os.path.dirname()
返回一个空字符串,反过来,当它被馈送到{ {1}}没有任何意义。
修改
如何修复:使用walk
来获取脚本的完整路径,而不是单独使用sys.argv[0]
。然后os.path.abspath(sys.argv[0])
应用于 将为您提供目录名称,并在IDLE和命令行上工作。