0

这是我的代码,我们称之为“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 编程的新手,所以如果有人能解决这个问题或至少我出错的地方,我将不胜感激

4

2 回答 2

2

我认为问题是这样的:当您从 IDLE 运行时,会sys.argv[0]保留脚本的整个路径,因此可以os.path.dirname()正确提取目录名。但是当你从命令行运行时,sys.argv[0]它只包含脚本名称,比如example.py,而不是路径,因此os.path.dirname()返回一个空字符串,反过来,当它被输入时,walk它不会给出任何有意义的东西。

编辑

如何修复:不要sys.argv[0]单独使用,而是使用os.path.abspath(sys.argv[0])来获取脚本的完整路径。然后os.path.dirname()应用会给你目录名称,并在 IDLE 和命令行上工作。

于 2012-12-12T21:16:29.357 回答
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。如果您想使用所在的目录example.py,您可以执行以下操作:

data_files = [x[2] for x in os.walk(os.path.abspath(__file__))]
于 2012-12-12T21:07:38.460 回答