【问题标题】:Activate virtualenv via os.system()通过 os.system() 激活 virtualenv
【发布时间】:2010-12-14 01:12:15
【问题描述】:

我正在编写一个基于 Python 的 shell 脚本来样板化一个带有 virtualenv、pip 和 fabric 的 Django 应用程序。应该很简单,但似乎我无法通过 shell 脚本在 virtualenv 中激活和运行命令。

os.system('virtualenv %s --no-site-packages' % project_name)
os.system('source %s/bin/activate' % project_name)
os.system('easy_install pip')

运行时出现以下错误:

$ startproject+ -s false sample
New python executable in sample/bin/python
Installing setuptools............done.
/testing
Searching for pip
Best match: pip 0.4
Processing pip-0.4-py2.6.egg
pip 0.4 is already the active version in easy-install.pth
Installing pip script to /usr/local/bin
error: /usr/local/bin/pip: Permission denied

显然source 行没有运行,但为什么呢?是并发/线程问题,还是 virtualenv 更深层次的问题?

谢谢!

【问题讨论】:

    标签: python django virtualenv fabric pip


    【解决方案1】:

    根本不要使用“源激活”。它只会改变你的 shell PATH 以将 virtualenv 的 bin 目录放在首位。我想你的脚本知道它刚刚创建的 virtualenv 的目录;您所要做的就是通过完整路径调用 _virtualenv_dir_/bin/easy_install。或者 _virtualenv_dir_/bin/python 用于在 virtualenv 中运行任何其他 python 脚本。

    【讨论】:

      【解决方案2】:

      您还可以安装 virtualenvwrapper,并使用 postmkvirtualenv 挂钩。我使用它自动将 pip 和 IPython 的新副本引入我创建的 virtualenvs 中(因为我不希望它使用我的系统 IPython)。我也用它来将 pythonw 复制到 virtualenv 中,否则基于 wx 的东西将不起作用。看起来像这样:

      easy_install pip
      pip install -I ipython
      cd ~/bin
      python install_pythonw.py ${VIRTUAL_ENV}
      

      【讨论】:

        【解决方案3】:

        对 os.system 的每次调用都会在一个新的子 shell 中运行该命令,该子shell 具有与原始 python 进程相同的属性。

        尝试将命令放在一个用分号分隔的字符串中。

        【讨论】:

          【解决方案4】:

          每个os.system 调用都会创建一个新进程。您需要确保activateeasy_install 在同一个os.systemsubprocess 调用中运行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-13
            • 1970-01-01
            • 1970-01-01
            • 2017-11-12
            • 2021-02-24
            相关资源
            最近更新 更多