我正在开发一个程序,它将找到一些文件并将文件信息提供给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"正如您所看到的,我正在使用一个混合的数据包,获取一些数据片段和一些来自类调用的数据(如果我的术语有点不正确,请放心,我已经学习python大约4天了,请很好地纠正我)。如果像这样使用这些数据是“非unpythonic”,请告诉我。
期待您的投入
发布于 2013-02-13 02:19:50
免责声明--我不使用窗户
我想你可能想要这样的东西:
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时,它期望list元素是它处理shell拆分参数的方式。另一个选项是传递一个字符串(而不是列表),就像将其放入windows并将shell=True传递给Popen一样。但这种方法并不可取,因为它更容易受到空壳注入不安全性的影响。
https://stackoverflow.com/questions/14845352
复制相似问题