How to set environment variables and call a perl script with parameters in python subprocess.popen?
我想有一个方法同时做3件事:
创建一个运行vsvars32.bat的子进程(visual studio批处理文件)
在此子流程中设置环境变量。例如,在cmd行中:
- SET MYDIR = C:\This\this\here
- SET DIR = %MYDIR%
- SET PATH = %DIR%\bin;%PATH%
同样在这个子进程中调用带有参数的perl脚本。 在cmd中:
- cd %MYDIR%\SOURCE\FILES
- My_Perl.pl -Name Mac -owner -details -vs_version 2005 -Run_type rebuild
我在python中创建了一个代码:
myenv = {'MYDIR' : 'C:\This\this\here',
'DIR' : '%MYDIR%',
'PATH' : '%DIR%\bin;%PATH%'}batchCmd = 'c:/.../vsvars32.bat'
perlCmd = 'c:/.../MyPerl.pl'
perlValues = ['-Name', 'Mac', '-owner', '-details', '-vs_version', '2005', '-Run_type', 'rebuild']
process = subprocess.Popen(['cmd','/c', batchCmd ,'&&', perlCmd, perlValues], shell=False, stdin = subprocess.PIPE, stdout = subprocess.PIPE, env = myenv)
问题是函数subprocess.popen无法识别myenv值和perlValues。
尝试将perl.exe添加到perl cmd。
1 | perlCmd = 'C:\perl\perl.exe c:/.../MyPerl.pl' |
其次,在一个地方使用反斜杠,在另一个地方使用斜杠。 那可能是个问题。
1 2 | myenv = {'MYDIR' : 'C:\This\this\here', using backslash '%DIR%\bin;%PATH%'} using slash |
只需尝试打印出env,就可以看到环境是否已填充:
1 | process = subprocess.Popen(['cmd','/c', 'set'], shell=False, stdin = subprocess.PIPE, stdout = subprocess.PIPE, env = myenv) |
另外,在执行perl脚本之前忘记了cd。
1 | process = subprocess.Popen(['cmd','/c', batchCmd ,'&&', 'cd %MYDIR%\SOURCE\FILES', '&&', perlCmd, perlValues], shell=False, stdin = subprocess.PIPE, stdout = subprocess.PIPE, env = myenv) |
问候,