向 VirtualEnv 写入 Shell 命令?

Writing Shell Commands to VirtualEnv?

有没有办法在虚拟环境激活后向其写入命令?例如,假设我有一个 Python 或 Bash 脚本可以做一些事情,即

  1. 制作一个虚拟环境
  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 创建一个新的虚拟环境有关,因此它正在创建一个新进程。

我也知道 shell=True 是不好的做法,但截至目前,我并不担心输入未经处理的可能性。

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

首先感谢@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

编辑:这对于尝试做类似事情的人也可能有用:How to source virtualenv activate in a Bash script