从Python脚本运行带有多个参数的Windows可执行文件
我正在开发一个程序,这个程序会找到一些文件,并把文件信息提供给一个NSIS脚本。这个NSIS脚本接受的命令行格式如下:
makensis.exe /DON="This is one" /DOD="c:\path1\path2 to dir\path 3" scriptfile.nsi
每次运行这个程序时,开关的值都会变化。我尝试使用subprocess.call和subprocess.Popen来执行这个命令,但遇到的问题跟引号有关。
首先,subprocess调用似乎把整个参数语句都放在了双引号里,这让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才四天,请温柔地纠正我。) 如果这样使用数据被认为是“不符合Python风格”,请告诉我。
期待你的反馈!
1 个回答
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']])
当命令行被读取时,系统会根据没有被引号包裹和没有被转义的空格来分割命令。你在使用Popen
时,如果传入一个列表,它会期望这个列表的元素就像在命令行中被分割后的样子。另一种选择是传入一个字符串(而不是列表),这个字符串要和你在Windows命令行中输入的一模一样,并且要把shell=True
传给Popen
。不过这种方法不太推荐,因为它更容易受到命令注入的安全威胁。