2013-07-20 33 views
1

我知道這個問題已經被詢問了很多次,我想我已經閱讀了他們中的每一個,但我無法找到我的問題的答案。我試圖在Windows XP機器上運行可執行文件。可執行文件位於一系列文件夾中。使用子進程運行帶有標誌的可執行文件

C:\folder\program.exe 

當我運行程序時,我需要包括一個標誌和路徑。

program -f\path\to\file.txt 

如果我瀏覽到該文件夾​​並運行上述使用它工作正常CLI命令。我想從我的python腳本中運行這個程序。

我已經試過Subprocess.popensubprocess.call,我似乎沒有得到任何錯誤,但程序也沒有執行。

有沒有人有什麼我可以嘗試的建議?謝謝

def Run(Path='\data\file.txt'): 
    import subprocess, time 

    cmd = '-f'+Path 
    subprocess.Popen(["program", cmd, "C:\folder\\"]) 


def Run(Path='\data\file.txt'): 
     import subprocess, time 

     cmd = '-f'+Path 
     subprocess.call(["C:\folder\program.exe", cmd]) 
+1

您的CLI命令是你用'subprocess.Popen'做什麼不同。你在popen中的命令有額外的部分。它將是「program -f \ data \ file.txt C:\ folder \\」,而您的cli命令只是前兩位。 – mavili

+0

您可能對[sh](http://amoffat.github.io/sh/)模塊感興趣 - 比原始子流程更易於使用。 –

+0

shell = True 例如:subprocess.call([「C:\ folder \ program.exe」,cmd],shell = True) 使用中間shell意味着變量,glob模式和其他特殊shell特徵命令字符串在命令運行前被處理。 http://pymotw.com/2/subprocess/index.html#module-subprocess – Prasath

回答

3

您在字符串中使用反斜槓。如果你不逃避它們,它會嘗試將反斜槓解釋爲轉義字符。例如,您的非轉義的字符串:

>>> '\data\file.txt' 
'\\data\x0cile.txt' 

注意\f被變成了一個不同的角色。這是因爲如果您查看table of escape characters,您會看到\f映射到ASCII換頁符(FF)字符。你會想要麼逃避他們:

>>> '\\data\\file.txt' 
'\\data\\file.txt' 

,或者使用文本字符串:

>>> r'\data\file.txt' 
'\\data\\file.txt' 

例如,這裏是重寫你的Run功能的嘗試:

import subprocess 
import time 

def Run(path='\\data\\file.txt'): 
    flag = '-f%s' % path 
    subprocess.call(['C:\\folder\\program', flag]) 

你應該調用程序時總是使用絕對路徑。如果你只有相對於你的腳本的路徑,你可以建立一個新的絕對路徑,像這樣的東西:

import os.path 
script_dir = os.path.abspath(os.path.dirname(__file__)) 
cmd = os.path.join(script_dir, '\\relative\\path\\to\\program.exe') 
+0

感謝您的快速響應,我試了你的答案,我什麼都沒有。我也注意到我可以從它的in文件夾運行可執行文件,但是我無法從其他地方運行它。我將它添加到我的PATH變量中,但仍無法運行。這也可能是一個問題嗎?謝謝 – Drewdin

+0

您是否指定程序的完整路徑?如果沒有,你應該將'cwd'參數設置爲'subprocess.call',它告訴它在嘗試執行程序之前要進入哪個目錄。 – jterrace

+0

添加了有關答案路徑的信息。 – jterrace

相關問題