2013-02-13 41 views
0

我正在研究一個程序,它將查找一些文件並將文件信息提供給NSIS腳本。 NSIS腳本接受如下命令行:從多個參數的python腳本運行Windows可執行文件

makensis.exe /DON="This is one" /DOD="c:\path1\path2 to dir\path 3" scriptfile.nsi 

每次執行程序時,開關的值都會改變。我試圖使用subprocess.call和subprocess.Popen來執行此操作。我遇到的問題與引用有關。

首先,子進程調用似乎將整個參數語句放在雙引號之間,使得NSIS將它們看作一個參數。其次,我在命令行中正確引用單個開關時遇到了一些困難。這是我的程序目前的樣子的片段。

subprocess.Popen([setup.profile['NSISExe'], ' /DON="' + setup.profile['DESC'] + '" /DOD="' + setup.profile['InstallDir'] + \ 
    '" /DMT="' + app.machine_type.get() + '" /DSD="' + os.path.join(WinShellVar.LOCAL_APPDATA, 'MLC CAD', appname) + \ 
    '" /DXV=X6 ' + setup.profile['NSISScript']]) 

這裏是從NSIS

Can't open script " /DON="Mastercam X6 Standard" /DOD="C:\Users\John\Desktop" /D 
MT="mill" /DSD="C:\Users\John\AppData\Local\MLC CAD\mcdeftool" /DXV=X6 bin\packa 
ge.002.nsi" 

輸出正如你可以看到我使用的數據好壞參半,得到一些比特類型的字典和一些從類調用(很容易在我身上如果我的條款有些不正確,我現在已經學習python了大約4天了,請糾正我的錯誤)。如果使用這樣的信息時顯示「unpythonic」,請告訴我們。

期待您輸入

+0

作爲樣式的註釋,如果有某種未終止的支架掛在周圍,則不需要尾隨的'\'來在python中繼續一行。例如'([{' – mgilson 2013-02-13 02:24:09

+0

re:我以前的評論 - 進一步的解釋可以在python [style guide]中找到(http://www.python.org/dev/peps/pep-0008/#indentation) – mgilson 2013-02-13 02:29:54

回答

2

免責聲明 - 我不使用Windows


我想你可能想是這樣的:

subprocess.Popen([setup.profile['NSISExe'], '/DON=' + setup.profile['DESC'], 
        '/DOD=' + setup.profile['InstallDir'], 
        '/DMT=' + app.machine_type.get(), 
        '/DSD=' + os.path.join(WinShellVar.LOCAL_APPDATA, 'MLC CAD', appname), 
        '/DXV=X6', 
        setup.profile['NSISScript']]) 

當shell讀取命令行,它分裂在非引用,未轉義的空白。當你將一個列表傳遞給Popen時,它期望列表元素是它在shell拆分參數之後看起來的樣子。另一種選擇是傳遞一個字符串(而不是一個列表),正好是,因爲您將它放入Windows Shell並將shell=True傳遞到Popen。但是這種方法並不是首選,因爲它更容易受殼體注入不安全因素的影響。

+0

這個作品!我看到的問題是我試圖給python很多幫助。多麼好聽的語言,至今還喜歡它! – 2013-02-13 02:30:36

+0

@JohnMcCord - 它只會變得更好:)。我一直在爲它工作了2年,現在我越來越喜歡它了:) – mgilson 2013-02-13 02:31:20

相關問題