我想写一个脚本来调用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