2014-06-20 28 views
0

我想写一个脚本来调用一个Python程序。我已经涉足了bash和fish,但随着脚本逻辑变得更加复杂(使用Git等等),我越来越倾向于使用Python。 (无论是程序和脚本是Python 2.7版在Ubuntu 14.04)如何从Python脚本调用Python + PYTHONPATH + virtualenv?

不过,我有用于调用一些有实力的要求:

  • 自定义PYTHONPATH必须设置(每次都相同)
  • 一的virtualenv需要(可基于用户输入/逻辑)
  • 程序参数是必需的(可基于用户输入/逻辑)

bash的等效是这样的:

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

正如你可以看到我用pew激活我的virtualenv而不是virtualenvwrapper或直接调用激活脚本。但我很高兴使用任何virtualenv库。

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

+0

所以,你的问题是,你想从Python脚本调用'python -m MODULE --ARGUMENT'? – jabaldonedo

+0

@jabaldonedo @jabaldonedo理想情况下,选择virtualenv将成为逻辑的一部分,因此是理想的python脚本的一部分 - 我已更新我的问题以使其更清晰 – d3vid

+0

您是否尝试使用子进程从Python中调用这些命令? – jabaldonedo

回答

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

来调用包装器,谢谢!由于我们的讨论,我有一个基于shell的解决方案(请参阅我的答案),但我也会尝试这种纯python方法 – d3vid

+0

不客气。还要记住你可以在Python中设置/获取环境变量:http://stackoverflow.com/questions/5971312/how-to-set-environment-variables-in-python。 BTW upvote,如果你发现答案有用:) – jabaldonedo

0

基于在评论中讨论,它发生,我可以写一个简单的,一般外壳脚本调用的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