【问题标题】:how to copy modules from one virtualenv to another如何将模块从一个 virtualenv 复制到另一个
【发布时间】:2012-02-06 07:26:21
【问题描述】:

是否可以将 python 模块从一个 virtualenv 复制到另一个 virtualenv。如果是这样,这是如何完成的?

【问题讨论】:

    标签: python django virtualenv pip


    【解决方案1】:

    我在 Windows 10 上的另一个 Python venv 上安装“wordcloud”时遇到问题。软件包安装在另一个项目的同一台机器上。

    Users/<user>/PycharmProjects/<projectname>/venv/Lib/site-packages 复制“wordcloud”和“wordcloud-1.8.1.dist-info”文件夹并粘贴到您的新项目/<projectname>/venv/Lib/site-packages

    【讨论】:

      【解决方案2】:

      似乎我们不能只是将一个 virtualenv 复制为另一个。 即使您在激活文件中更改 $VIRTUAL_ENV,它仍然像在原始虚拟环境中一样,并且 pip 会将所有软件包安装到原始站点包/

      【讨论】:

        【解决方案3】:

        我正在使用 Ubuntu-14.04-64 的 64 位机器上工作。我编译并安装了python-3.4.3到/opt/python3.4/,并基于这个python创建了一个vitualenv。

        mkvirtualenv -p /opt/python3.4/bin/python venv1
        

        也是为了方便:

        sudo apt-get install virtualenvwrapper
        

        安装 venv 并成功使用 PyQt5(难点)加上 numpy、scipy、ipython 等。 我安装了 virtualenv-clone:

        workon myvenv
        pip install virtual-clone
        deactivate
        

        然后跑:

        virtualenv-clone venv1 venv2
        

        PyQt5 就是这样工作的。命令行提示仍然将 venv1 命名为活动但在 ~/.virtualenv/venv2

        cat activate* | grep "venv1"
        

        显示三个文件 activateactivate.cshactivate.fish

        中的 3 个条目

        在激活中,改变

        if [ "x(myvenv1) " != x ] ; then
                PS1="(myvenv1) $PS1"
        else
        

        ...
                PS1="(myvenv2) $PS1"
        ...
        

        activate.csh中改变

        if ("venv1" != "") then
                set env_name = "venv1"
        else
        

        ...
            set env_name = "venv2"
        ...
        

        activate.fish中改变

        if test -n "(venv1) "
                printf "%s%s%s" "(venv1) " (set_color normal) (_old_fish_prompt)
                return
        end
        

        ...
            printf "%s%s%s" "(venv2) " (set_color normal) (_old_fish_prompt)
        ...
        

        现在当您source ~/.virtualenv/venv2/bin/activateworkon venv2 时,命令提示符将正确显示您的环境(venv1 的克隆副本)。

        编辑:这并没有回答问题“如何将模块从一个虚拟环境复制到另一个”,但我很确定结果在许多情况下是所需的,即创建一个基于先前创建的新 venv 的新 venv,其中包括(所有)先前安装的模块。

        【讨论】:

          【解决方案4】:

          只要您将它们从一个虚拟环境移动到 同一台 机器上的另一个虚拟环境,您就可以轻松做到:

          $ cp -r [env1]/lib/pythonX.X/site-packages/* [env2]/lib/pythonX.X/site-packages/
          

          但是,如果环境位于不同的机器上或使用不同版本的 python 或其他一些主要差异,那么这可能不是一个好主意。一般来说,生成requirements.txt 会更安全,然后使用它在其他环境中加载所有相同的模块。您可以根据需要手动创建文件,但使用pip 会更容易。

          $ pip freeze -E [env1] > requirements.txt
          

          或者,如果你的 virtualenv 已经被激活,你可以简单地这样做:

          $ pip freeze > requirements.txt
          

          然后,在你的其他环境中,你可以这样做:

          $ pip install -E [env2] -r /path/to/requirements.txt
          

          【讨论】:

          • 如果我只是尝试像这样复制 一个 包会不会出问题?
          • 问题不在于复制的包的数量,而在于源和目标之间的Python版本、系统架构等方面的差异。如果源和目标在同一台机器上,你应该没问题;如果它们在不同的机器上,你应该使用pip freeze
          【解决方案5】:

          通常您可以将 .egg-info 从 virtualenv 的 lib/site-packages 文件夹复制到其他环境的 lib/site-packages。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多