使用多个参数从python脚本运行可执行文件

时间:2013-02-13 02:13:42

标签: python windows python-3.x

我正在开发一个程序,它会找到一些文件并将文件信息提供给NSIS脚本。 NSIS脚本接受命令行,如下所示

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"

正如你所看到的,我正在使用一个混合的数据包,获取一些用于dicts的部分和一些来自类的调用(如果我的条款有点不正确,我会很容易,我已经学习了python大约4天现在,请好好纠正我。)如果使用这样的数据是“unpythonic”,请告诉我。

期待您的意见

1 个答案:

答案 0 :(得分: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一样。但这种方法并不是首选方法,因为它更容易受到壳注入不安全因素的影响。