2016-02-20 39 views
-1

我有这样的内容纺织:为什么sys.argv()给我一个索引超出限制?

honda motor co of japan doesn't expect output at its car manufacturing plant in thailand 

当我跑厕所-l TextFile.txt的,我收到0

的问题是我运行,需要算一个python脚本此文本文件中的行数并相应地运行。我尝试了两种计算行数的方法,但他们都一直给我0,我的代码拒绝运行。

Python代码:

#Way 1 
with open(sys.argv[1]) as myfile: 
    row=sum(1 for line in myfile) 
print(row) 

#Way 2 
row = run("cat %s | wc -l" % sys.argv[1]).split()[0] 

我收到一个错误,指出:with open(sys.argv[1]) as myfile IndexError: list index out of range

我从PHP调用接收这个文件:

exec('python testthis.py $file 2>&1', $output); 

我怀疑argv.sys [1 ]给我一个错误。

+2

如果'sys.argv [1]'抛出一个'IndexError',那么它没有第二个元素。你有没有试过看它包含什么? – jonrsharpe

+1

听起来'$ file'正在扩展为一个空字符串,所以你没有参数调用你的Python程序。 –

回答

2

您的Python代码的第一个示例没有任何问题(方法1)。

问题是PHP调用代码;传递给exec()的字符串使用single quotes,这会阻止将$file变量扩展到命令字符串中。结果调用因此将文字字符串$file作为参数传递给exec(),后者又在shell中运行该命令。该shell将$file当作一个shell变量并试图扩展它,但它没有被定义,所以它扩展为一个空字符串。由此产生的呼叫是:

python testthis.py 2>&1 

Python因其缺少参数而引发IndexError: list index out of range

在PHP中调用exec()修复时使用double quotes周围的命令:

$file = 'test.txt'; 
exec("python testthis.py $file 2>&1", $output); 

现在$file可以根据需要扩展成的字符串。

这确实假设你实际上想要将PHP变量扩展到字符串中。因为exec()在shell中运行该命令,所以也可以在shell的环境中定义该变量,并由shell将其扩展为最终命令。要做到这一点,你使用单引号周围的命令传递给exec()


注意的“办法1”的Python代码将返回1行数,而不是0一样wc -l

相关问题