Python 将Shell命令写入VirtualEnv?

Python 将Shell命令写入VirtualEnv?,python,linux,shell,subprocess,virtualenv,Python,Linux,Shell,Subprocess,Virtualenv,我希望这不是一个愚蠢的问题……但是,有没有一种方法可以在虚拟环境被激活后向其写入命令?例如,假设我有一个Python或Bash脚本,它做了一些事情,例如,制作一个virtualenv,2。激活它。然后是3。对新创建的虚拟环境的shell执行命令?例如,我正在做这样的事情: activate_this = subprocess.call("/bin/bash --rcfile " + "/home/" + os.getlogin() + "/mission-control/venv/bin/act

我希望这不是一个愚蠢的问题……但是,有没有一种方法可以在虚拟环境被激活后向其写入命令?例如,假设我有一个Python或Bash脚本,它做了一些事情,例如,制作一个virtualenv,2。激活它。然后是3。对新创建的虚拟环境的shell执行命令?例如,我正在做这样的事情:

activate_this = subprocess.call("/bin/bash --rcfile " + "/home/" + os.getlogin() + "/mission-control/venv/bin/activate", shell=True)
        process = execfile(activate_this, dict(__file__=activate_this))
        process.communicate(subprocess.call(virtualenv.create_bootstrap_script(textwrap.dedent
            ("""
                import subprocess
                subprocess.call("pip install -r " + os.environ['VIRTUAL_ENV'] + "/requirements.txt", shell=True)
            """
            ))))
我想在激活环境后安装requirements.txt文件,但是在创建虚拟环境后,我无法让子流程模块与shell通信。我认为这可能与我通过execfile创建一个新的虚拟环境有关,因此,execfile正在创建一个新的进程。提前感谢


此外,我知道shell=True是一种不好的做法,但就目前而言,我并不担心未初始化输入的可能性

首先,感谢@Ryne Everett的帮助。因此,我通过放弃Python解决方案并创建一个Bash文件来解决这个问题,我在Python脚本的子进程中调用了这个文件。子进程调用执行Bash文件,该文件处理virtualenv中的创建和执行。我不知道如何只用Python来解决这个问题。我相信有办法,但这似乎是一个更简单的解决办法。Bash脚本如下所示:

. "$VIRTUAL_ENV/bin/activate"
pip install -r "$VIRTUAL_ENV/requirements.txt"
#!/bin/bash 

MISSION_CONTROL="$PWD"

if [ ! -d "$MISSION_CONTROL/venv" ]; then 
    virtualenv $MISSION_CONTROL/venv --no-site-packages
    echo "Welcome to Mission Control..."
    /bin/bash --rcfile $MISSION_CONTROL/venv/bin/activate
fi 

if [ -d "$MISSION_CONTROL/venv" ]; then 
    pip install -r $MISSION_CONTROL/requirements.txt 
fi

编辑:这对尝试做类似事情的人也很有用:

首先,感谢@Ryne Everett的帮助。因此,我通过放弃Python解决方案并创建一个Bash文件来解决这个问题,我在Python脚本的子进程中调用了这个文件。子进程调用执行Bash文件,该文件处理virtualenv中的创建和执行。我不知道如何只用Python来解决这个问题。我相信有办法,但这似乎是一个更简单的解决办法。Bash脚本如下所示:

#!/bin/bash 

MISSION_CONTROL="$PWD"

if [ ! -d "$MISSION_CONTROL/venv" ]; then 
    virtualenv $MISSION_CONTROL/venv --no-site-packages
    echo "Welcome to Mission Control..."
    /bin/bash --rcfile $MISSION_CONTROL/venv/bin/activate
fi 

if [ -d "$MISSION_CONTROL/venv" ]; then 
    pip install -r $MISSION_CONTROL/requirements.txt 
fi

编辑:这对尝试做类似事情的人也很有用:

那么shell脚本调用python脚本调用子进程调用python脚本调用子进程调用shell脚本?为什么?更有用的一点是,我猜VirtualVWrapper是您要找的。嗯,所以我真正想做的就是为我的venv编写shell命令。第一种方法是简单地激活Make,然后激活venv。现在,由于子进程是将python命令传递给shell的方式,所以我所要做的就是类似于
subprocess.call(“pip install-r”+os.environ['VIRTUAL_ENV']+“/requirements.txt”,shell=True)
,这应该可以编写my venv shell,但它没有。我认为这是因为当我调用execfile时,venv的进程与启动它的脚本的进程不同,也可能是venv的路径不同。create_bootstrap_脚本只是试图将命令传递给虚拟环境。从
create\u bootstrap\u script
上的文档中可以看出:虽然这会创建一个环境,但不会将任何内容放入环境中。开发人员可能会发现,分发一个设置特定环境的脚本非常有用,例如,安装特定web应用程序的脚本。除非为此需要python,否则我将坚持使用纯shell解决方案。因此,shell脚本调用python脚本调用子进程调用python脚本调用子进程调用shell脚本?为什么?更有用的一点是,我猜VirtualVWrapper是您要找的。嗯,所以我真正想做的就是为我的venv编写shell命令。第一种方法是简单地激活Make,然后激活venv。现在,由于子进程是将python命令传递给shell的方式,所以我所要做的就是类似于
subprocess.call(“pip install-r”+os.environ['VIRTUAL_ENV']+“/requirements.txt”,shell=True)
,这应该可以编写my venv shell,但它没有。我认为这是因为当我调用execfile时,venv的进程与启动它的脚本的进程不同,也可能是venv的路径不同。create_bootstrap_脚本只是试图将命令传递给虚拟环境。从
create\u bootstrap\u script
上的文档中可以看出:虽然这会创建一个环境,但不会将任何内容放入环境中。开发人员可能会发现分发一个用于设置特定环境的脚本非常有用,例如安装特定web应用程序的脚本。除非您需要python,否则我将坚持使用纯shell解决方案。因此,当我创建一个Bash脚本来尝试以下操作时,我得到:
目录'/home/user/blah/venv'不可安装。找不到文件'setup.py'。
Hmm。我认为如果不查看需求文件的内容,就无法调试该文件。如果您手动将上述命令键入shell,它们是否有效?非常正确@Ryne Everett。实际上,我可能已经找到了一个使用Bash的解决方案,我将很快报告。因此,当我创建一个Bash脚本来尝试以下操作时,我得到:
目录'/home/user/blah/venv'不可安装。找不到文件'setup.py'。
Hmm。我认为如果不查看需求文件的内容,就无法调试该文件。如果您手动将上述命令键入shell,它们是否有效?非常正确@Ryne Everett。实际上,我可能已经找到了一个使用Bash的解决方案,我将很快报告。