我想编写一个脚本来调用Python程序。我已经涉足bash和fish,但随着脚本逻辑变得更加复杂(使用Git等等),我越来越倾向于使用Python。 (程序和脚本都是Ubuntu 14.04上的Python 2.7)
但是,我对调用有一些强烈的要求:
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
调用呢?)
答案 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