如何从Python脚本调用Python + PYTHONPATH + virtualenv?

时间:2014-06-20 08:09:20

标签: python python-2.7 virtualenv pythonpath

我想编写一个脚本来调用Python程序。我已经涉足bash和fish,但随着脚本逻辑变得更加复杂(使用Git等等),我越来越倾向于使用Python。 (程序和脚本都是Ubuntu 14.04上的Python 2.7)

但是,我对调用有一些强烈的要求:

  • 必须设置自定义PYTHONPATH(每次都相同)
  • 需要virtualenv(可能会根据用户输入/逻辑进行更改)
  • 程序参数是必需的(可能会根据用户输入/逻辑而改变)

bash的等价物如下:

~$ pew workon <VIRTUALENV>
~$ export PYTHONPATH=</PROGRAM/PATH>
~$ python -m <MODULE.MODULE> --<ARGUMENT> --<ARGUMENT>=<VALUE>

正如您所看到的,我使用pew来激活我的virtualenv而不是virtualenvwrapper或直接调用activate脚本。但我很高兴使用任何virtualenv库。

或者,这不可能吗? (在这种情况下,我可以编写一个瘦shell包装器来设置环境,但是如何进行python -m MODULE --ARGUMENT调用呢?)

2 个答案:

答案 0 :(得分:1)

这是一个想法。定义一个处理对控制台调用的函数,然后调用该函数:

import subprocess

''' This functions sends commands to console '''
def command(cmd):
    try:
        p = subprocess.Popen(cmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, close_fds = True)
        stdout = p.communicate()
        return stdout[0]
    except Exception as ex:
        raise Exception(ex)

# now define your variables and make calls

VIRTUALENV = ...
PYTHON_PATH = ...

command("pew workon {}".format(VIRTUALENV))
command("export PYTHONPATH= {}".format(PYTHON_PATH))
command("python -m {} --{} --{}={}".format(...))

答案 1 :(得分:0)

基于评论中的讨论,我发现我可以编写一个简单的通用shell脚本来调用Python + PYTHONPATH + virtualenv + module +参数,并从更复杂的Python脚本调用那个简单的脚本来确定这些值

#! /usr/bin/fish
# Call a Python module with virtualenv, PYTHONPATH and arguments.
# (TODO: make it more flexible by making arguments optional (plus, learn more fish))

# set variables
set PY_PATH $argv[1]
set PY_VENV $argv[2]
set PY_MODULE $argv[3]
set PY_ARGUMENTS $argv[4..-1]

# invoke Python
set -x PYTHONPATH $PY_PATH
pew in $PY_VENV python -m $PY_MODULE $PY_ARGUMENTS