我正在开发一个程序,它会找到一些文件并将文件信息提供给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”,请告诉我。
期待您的意见
答案 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
一样。但这种方法并不是首选方法,因为它更容易受到壳注入不安全因素的影响。