0

我正在开发一个程序,该程序将找到一些文件并将文件信息提供给 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”,请告诉我。

期待您的意见

4

1 回答 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']])

当 shell 读取命令行时,它会拆分为非引号、非转义的空格。当您将列表传递给 时Popen,它期望列表元素是外壳拆分参数后的样子。另一种选择是传递一个字符串(而不是一个列表),就像你将它放入 windows shell 并传递shell=TruePopen. 但这种方法不是首选,因为它更容易受到壳注入不安全的影响。

于 2013-02-13T02:19:50.910 回答