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



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

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

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

对应的bash是:

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

您可以看到,我使用pew来激活我的virtualenv,而不是virtualenvwrapper或直接调用激活脚本。但我很乐意使用任何虚拟环境库。

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

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

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(...))

根据评论中的讨论,我想到我可以编写一个简单的通用shell脚本来调用Python + PYTHONPATH + virtualenv +模块+参数,并从一个更复杂的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

最新更新