2013-05-03 50 views
0

我嘗試從命令中運行帶有ini配置文件的python腳本的Windows命令行應用程序,我懷疑它沒有在執行時傳遞。使用ini文件參數從python運行windows命令行程序

該命令是c:\ BLScan \ blscan.exe test.ini。

ini文件是應用程序需要知道要掃描的參數的配置文件。

這是使用

import subprocess 
from subprocess import Popen, PIPE 

cmd = '/blscan/blscan test.ini' 

p = Popen(cmd , stdout=PIPE, stderr=PIPE) 
out, err = p.communicate() 
print "Return code: ", p.returncode 
print out.rstrip(), err.rstrip() 

當我使用subprocess.popen調用應用程序它不看要讀ini文件腳本IM。設備線是一個指示器,表明調音器沒有從ini文件中識別出來,因此程序正在下降到默認調諧器。

Return code: 0 
BLScan ver.1.1.0.1091-commited 
Config name: .\test.ini 
Device 0: TBS 6925 DVBS/S2 Tuner 
Device number: Total Scan Time = 0.000s 
Transponders not found ! 
>>> 

這是從dos shell運行時的樣子。

C:\BLScan>blscan test.ini 
BLScan ver.1.1.0.1091-commited 
Config name: .\test.ini 
Scan interval 0 
From 3400 to 3430 Mhz, Step 5 Mhz, Horizontal, Minimal SR 1000 KS, Maximal SR 10 
0000 KS 
3400 Mhz ... 
3405 Mhz ... 
3410 Mhz ... 

任何意見將理解

回答

1

當您從DOS shell中運行這個,你當前的工作目錄是C:\BLscan,因爲是從提示明顯的告訴你:

C:\BLScan>blscan test.ini 

您也可以從錯誤輸出告訴它肯定看在當前工作目錄。 (一些Windows程序將,例如,嘗試在同一目錄作爲可執行...但你無法在算,而這一次沒有。)

Config name: .\test.ini 

因此,如果當前目錄不是C:\BLScan,它也不會在DOS shell中工作。試試這個:

C:\BLScan>cd \ 
C:\>\BLScan\blscan test.ini 

你會得到你在Python中得到的完全相同的錯誤。

如果你不能依靠在C:\ BLScan中,你必須傳遞一個絕對路徑。例如,這將再次起作用:

C:\>\BLScan\blscan \BLScan\test.ini 

Python與shell沒有區別。如果你給它一個像test.ini的相對路徑,它將使用當前的工作目錄。所以,你有相同的兩個選項:

os.chdir('/blscan') 
p = subprocess.popen('blscan test.ini') 

...或:

p = subprocess.popen(r'\BLScan\blscan \BLScan\test.ini') 
+0

感謝您花時間解決問題和解決方案。現在正常工作:) – satraver 2013-05-04 21:36:41

0

嘗試傳遞參數給subprocess.call作爲數組: subprocess.call([ 「/ blscan/blscan.exe」, 「test.ini」] )

此外,基於問題中的命令行與py的輸出,請仔細檢查blscan.exe工具是否工作,即使您的「工作目錄」不同。也許你需要在blscan.exe所在的同一工作目錄中。

os.chdir( 「C:\ BLScan」)

+1

在Windows上,'subprocess'通過組裝一個命令行字符串的工作原理,它可以傳遞給['CreateProcess'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx),所以使用這樣的參數列表真的沒有好處(除了當然,當你編寫跨平臺的代碼時)。 – abarnert 2013-05-03 23:23:54

0

您最可能需要的路徑傳遞到INI以及exe文件:如果您通過POPEN列表

clst = [r'C:\blscan\blscan.exe', r'C:\blscan\test.ini'] 
p = Popen(clst, stdout=PIPE, stderr=PIPE) 
# etc . . . 

,它會爲你正確引用參數。

+0

該列表在這裏不相關。 – abarnert 2013-05-03 23:24:18