如何设置环境变量并使用python subprocess.popen中的参数调用perl脚本?

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)

    问候,