程序在IDLE上运行但不是通过命令行运行

时间:2012-12-12 20:58:20

标签: python python-2.7

这是我的代码,我们称之为“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编程的新手,所以如果有人可以解决这个或至少我错的地方,我会非常感激

2 个答案:

答案 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和命令行上工作。