2015-06-23 70 views
1

我想在我的服务器上使用Python做一些基本的模块设置。它有点困难,因为我无法访问互联网。使用subprocess.check_output的环境变量Python

这是我的代码

import sys 
import os 
from subprocess import CalledProcessError, STDOUT, check_output 

def run_in_path(command, dir_path, env_var=''): 
    env_var = os.environ["PATH"] = os.environ["PATH"] + env_var 
    print(env_var) 
    try: 
     p = check_output(command, cwd=dir_path, stderr=STDOUT) 
    except CalledProcessError as e: 
     sys.stderr.write(e.output.decode("utf-8")) 
     sys.stderr.flush() 
     return e.returncode 
    else: 
     return 0 

def main(): 
    requests_install = run_in_path('python setup.py build', 
       'D:\installed_software\python modules\kennethreitz-requests-e95e173') 
    SQL_install = run_in_path('python setup.py install', # install SQL module pypyodbc 
        'D:\installed_software\python modules\pypyodbc-1.3.3\pypyodbc-1.3.3') 
    setup_tools = run_in_path('python setup.py install', # install setup tools 
        'D:\installed_software\python modules\setuptools-17.1.1') 
    psycopg2 = run_in_path('easy_install psycopg2-2.6.1.win-amd64-py3.3-pg9.4.4-release', # install setup tools 
        'D:\installed_software\python modules', ';C:\srv_apps\Python33\Scripts\easy_install.exe') 
    print('setup complete') 

if __name__ == "__main__": 
    sys.exit(main()) 

现在它变得棘手时,我开始尝试使用安装方便。它出现在我的ENV变量没有被使用我的电话subprocess.check_output

File "C:\srv_apps\Python33\lib\subprocess.py", line 1110, in _execute_child 
    raise WindowsError(*e.args) 
FileNotFoundError: [WinError 2] The system cannot find the file specified 

我不希望有升级到易安装默认安装3.4,因为我的其他模块不支持3.4。我的主要挑战是subprocess.check_call方法不会将环境变量作为输入,并且担心尝试使用Popen(),因为我从来没有真正使它成功地在过去使用。任何帮助将不胜感激。

回答

2

PATH应该包含目录例如,r'C:\Python33\Scripts',而不是文件如:r'C:\Python33\Scripts\easy_install.exe'

请勿任意命令硬编码utf-8,你可以使使用universal_newlines参数(未测试)文本模式:

#!/usr/bin/env python3 
import locale 
import sys 
from subprocess import CalledProcessError, STDOUT, check_output 

def run(command, *, cwd=None, env=None): 
    try: 
     ignored = check_output(command, cwd=cwd, env=env, 
           stderr=STDOUT, 
           universal_newlines=True) 
    except CalledProcessError as e: 
     sys.stderr.write(e.output) 
     sys.stderr.flush() 
     return e.returncode 
    else: 
     return 0 

实施例:

import os 

path_var = os.pathsep.join(os.environ.get('PATH', os.defpath), some_dir) 
env = dict(os.environ, PATH=path_var) 
run("some_command", cwd=some_path, env=env) 
run("another_command", cwd=another_path, env=env)