2016-02-20 74 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

相關問題