2012-12-12 30 views
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编程,所以我会非常感激,如果有人能解决这个问题或至少我出错的地方

+0

你使用什么命令从命令行调用它?你在做'python example.py文件夹'吗? –

+0

另外,为什么你有'except'语句,为什么它的最后一行(除了块以外呢?) –

+0

检查sys.argv的值[0] – joaquin

回答

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__))] 
+0

'os.path.abspath(sys.argv [0])'也可以工作,因为当'sys.argvp [0]'是空字符串时它会返回当前目录,就像当脚本从命令运行时那样线。 – martineau

2

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

编辑

如何解决:不要单独使用sys.argv[0]的,使用os.path.abspath(sys.argv[0])让你的脚本的完整路径。然后os.path.dirname()适用于会给你的目录名称,并在IDLE和命令行上工作。

+0

如果您还建议修复,我会投票赞成... – martineau

+0

@martineau - 那里!我建议修复.. ;-) –

+0

你的修复使它在IDLE和命令行都能正常工作,所以我按照承诺投票。然而,当你从命令行运行sys.argv [0]'时,你所说的内容是错误的 - 它是空的而不是脚本的名字。无论如何,你的修复工作是因为'os.path.abspath('')'返回当前目录。 – martineau