【问题标题】:Install a Python package into a different directory using pip?使用 pip 将 Python 包安装到不同的目录中?
【发布时间】:2011-02-24 07:41:50
【问题描述】:

我知道显而易见的答案是使用 virtualenv 和 virtualenvwrapper,但由于各种原因我不能/不想这样做。

那么如何修改命令

pip install package_name

要使pip 将软件包安装在默认site-packages 以外的其他位置?

【问题讨论】:

  • 现在第二个问题:当您已经安装到自定义目录时,如何使pip 不尝试从非自定义目录中删除旧版本。例如 - 一个系统范围的,你没有写权限。到目前为止,我只使用easy_install...
  • @TomaszGandor 我认为使用 --ignore-installed 选项应该可以防止 pip 尝试卸载已安装的软件包。
  • 对不起,我是 pip 的新手,但是您的问题与询问“如何将 pi 安装到不同版本的 python”相同吗?我有 python 3.4 和 3.5,但我希望我的 pip 安装转到 python 3.5。
  • @Charlie Nope,不同的问题。我对您的安装/意图知之甚少,但通常我可能会使用 virtualenvwrapper 并创建一个类似于 mkvirtualenv --python=/usr/bin/python3.5 env_name 的虚拟环境

标签: python pip


【解决方案1】:

用途:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

您可能还想使用--ignore-installed 来强制使用这个新前缀重新安装所有依赖项。您可以多次使用--install-option 来添加可以与python setup.py install 一起使用的任何选项(--prefix 可能是您想要的,但您可以使用更多选项)。

【讨论】:

  • 如果你这样做,有没有办法让pip freeze看到备用目录?
  • pip freeze 看起来在路径上,所以如果你喜欢PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freeze 它应该会看到它们。
  • 使用--prefix=$PREFIX_PATH 似乎不允许完全控制安装目录,因为它附加了系统特定的后缀(例如Windows 上的\Lib\site-packages)。有没有办法指定具体的目录?
  • @Piotr:是的,看到我的答案。使用 '--prefix' 有点粗略,但如果你想让你的纯 python 放在 /usr/lib/pythonX.Y/site-packages 而不是 /usr/local/lib/pythonX.Y/site- 下,效果很好包。
  • 4 年前的答案还不错,但 --target 选项现在存在。
【解决方案2】:

安装 Python 包通常只包含一些纯 Python 文件。如果包中包含数据、脚本和/或可执行文件,它们将安装在与纯 Python 文件不同的目录中。

假设您的包没有数据/脚本/可执行文件,并且您希望您的 Python 文件进入 /python/packages/package_name(而不是像使用 --prefix 时那样低于 /python/packages 的一些子目录),您可以使用一次性命令:

pip install --install-option="--install-purelib=/python/packages" package_name

如果您希望您的所有(或大部分)包裹都去那里,您可以编辑您的 ~/.pip/pip.conf 以包括:

[install]
install-option=--install-purelib=/python/packages

这样你就不会忘记一次又一次地指定它。

除非您指定附加安装选项(--prefix/--install-data/--install-scripts 等,否则包中包含的任何可执行文件/数据/脚本仍将转到其默认位置,详细信息请参阅custom installation选项)。

【讨论】:

  • 配置文件的一大优点。我个人在那里指定了--prefix,因为我在主目录中的共享服务器上有一个“本地”目录,并且在我移动到pip之前它被easy_install用作前缀。系统 $PATH$PYTHONPATH 之前已配置。而不是install-option=--install-purelib=/blah 有这个更新的target=/blah 选项/开关。这也不错,但有时您只需要替换 --prefix,即可与 setup.pyeasy_install 一起使用。
【解决方案3】:

--target 开关就是您要找的东西:

pip install --target=d:\somewhere\other\than\the\default package_name

但您仍然需要将 d:\somewhere\other\than\the\default 添加到 PYTHONPATH 才能从该位置实际使用它们。

-t, --target


将软件包安装到

。默认情况下,这不会替换 中的现有文件/文件夹。
使用 --upgrade 将 中的现有包替换为新版本。

如果目标开关不可用,则升级 pip:

在 Linux 或 OS X 上:

pip install -U pip

在 Windows 上(这适用于 an issue):

python -m pip install -U pip

【讨论】:

  • @DanH 运行 pip install --upgrade pip!
  • 这是真正的答案,只是在接受答案之后添加了相当多的选项。
  • @Ian Bicking 提到的--install-option="--prefix=$PREFIX_PATH"--target=$PATH 选项有什么区别?
  • target 是一个点子选项,您在install-option 中输入的所有内容都将传递给setup.py install command。基本上target 是自定义站点包位置。
  • 使用--target 可能会导致部分安装,因为它不会安装任何包含指定前缀的脚本/数据文件。似乎将--prefix--install-option 一起传递是完全控制使用的安装前缀的唯一正确方法。
【解决方案4】:

在 Python v2.7.3 (GNU/Linux) 上使用 pip v1.5.6,选项 --root 允许指定全局安装前缀,(显然)与特定包的选项无关。试试看,

$ pip install --root=/alternative/prefix/path package_name

【讨论】:

    【解决方案5】:

    在@Ian Bicking 的回答中加一分:

    使用--user 选项来指定安装目录,如果想将一些 Python 包安装到远程服务器上的主目录(没有 sudo 用户权限),也可以使用。

    例如,

    pip install --user python-memcached
    

    该命令会将包安装到 PYTHONPATH 中列出的目录之一。

    【讨论】:

      【解决方案6】:

      而不是--target 选项或--install-options 选项,我发现以下方法效果很好(来自https://github.com/pypa/pip/issues/446 上有关此问题的错误的讨论):

      PYTHONUSERBASE=/path/to/install/to pip install --user
      

      (或者在运行命令之前在你的环境中设置PYTHONUSERBASE目录,使用export PYTHONUSERBASE=/path/to/install/to

      这使用了非常有用的 --user 选项,但告诉它创建 binlibshare 和其他您希望使用自定义前缀而不是 $HOME/.local 的目录。

      然后您可以将其添加到您的PATHPYTHONPATH 和其他变量中,就像您添加普通安装目录一样。

      请注意,您可能还需要指定 --upgrade--ignore-installed 选项,如果它所依赖的任何软件包需要在 PYTHONUSERBASE 目录中安装更新版本,以覆盖系统提供的版本.

      完整示例:

      PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy
      

      ..将scipynumpy 软件包的最新版本安装到一个目录中,然后您可以将其包含在您的PYTHONPATH 中(在此示例中使用 bash 和 CentOS 6 上的 python 2.6):

      export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
      export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH
      

      使用 virtualenv 仍然是一个更好更整洁的解决方案!

      【讨论】:

      • 这适用于在 Docker 容器上运行的 Travis CI,而 --install-option="--prefix=$PREFIX_PATH" 解决方案则不能。
      • Noobie 问题,pip 创建的/bin 文件夹有多重要,--user--PREFIX 一样创建它,而 --target 没有。
      • 如果包安装在全局Python中,需要--ignore-installed
      • 此选项还兼容--editable 和本地安装。
      • 这个选项可以方便地以超级用户的身份为另一个非 root 用户安装软件包,而无需 su(例如,这在容器中可能会出现问题)。
      【解决方案7】:

      补充一下已经很好的建议,因为当我没有对 /usr/local 的写入权限时,我在安装 IPython 时遇到了问题。

      pip 使用 distutils 进行安装,this thread 讨论了这会如何导致问题,因为它依赖于 sys.prefix 设置。

      我的问题发生在 IPython 安装尝试写入“/usr/local/share/man/man1”但权限被拒绝。由于安装失败,它似乎没有在 bin 目录中写入 IPython 文件。

      使用“--user”有效,文件被写入~/.local。将 ~/.local/bin 添加到 $PATH 意味着我可以从那里使用“ipython”。

      但是,我正在尝试为多个用户安装它,并且已获得对 /usr/local/lib/python2.7 目录的写入权限。我在那里创建了一个“bin”目录并为 distutils 设置指令:

      vim ~/.pydistutils.cfg
      
      [install]
      install-data=/usr/local/lib/python2.7
      install-scripts=/usr/local/lib/python2.7/bin
      

      然后(-I 用于强制安装,尽管以前失败/.local 安装):

      pip install -I ipython
      

      然后我将/usr/local/lib/python2.7/bin 添加到$PATH

      我想我会包括这个,以防其他人在他们没有 sudo 访问权限的机器上遇到类似问题。

      【讨论】:

        【解决方案8】:

        为了准确地在我想要的位置安装库,我使用终端导航到我想要的目录位置

        pip install mylibraryName -t . 
        

        我从这个页面获取的逻辑:https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download

        【讨论】:

        • -t--target 的简写
        • 这是唯一对我有用的解决方案。 (Windows 7)
        【解决方案9】:

        较新版本的pip(8 或更高版本)可以直接使用--prefix option

        pip install --prefix=$PREFIX_PATH package_name
        

        其中$PREFIX_PATH为安装前缀,lib、bin等顶级文件夹所在的位置。

        【讨论】:

          【解决方案10】:

          我建议按照文档创建 ~/.pip/pip.conf 文件。注意文档中缺少指定的头目录,导致以下错误:

          error: install-base or install-platbase supplied, but installation scheme is incomplete
          

          conf文件的完整工作内容是:

          [install]
          install-base=$HOME
          install-purelib=python/lib
          install-platlib=python/lib.$PLAT
          install-scripts=python/scripts
          install-headers=python/include
          install-data=python/data
          

          不幸的是我可以安装,但是当尝试卸载时 pip 告诉我没有用于卸载过程的包....所以仍然有问题,但包会转到其预定义的位置。

          【讨论】:

            【解决方案11】:

            似乎没有人提到 -t 选项,但最简单的:

            pip install -t <direct directory> <package>
            

            【讨论】:

            【解决方案12】:

            如果你在 python 中使用 brew,不幸的是,pip/pip3 附带的选项非常有限。您没有上面提到的 --install-option、--target、--user 选项。

            Note 在 pip install --user
            普通的 pip install --user 对于 brewed Python 是禁用的。这是因为 distutils 中的一个错误,因为 Homebrew 编写了一个 distutils.cfg 来设置包前缀。 一种可能的解决方法(将可执行脚本放在 ~/Library/Python/./bin 中)是: python -m pip install --user --install-option="--prefix=" <package-name>

            你可能会觉得这条线很麻烦。我建议使用 pyenv 进行管理。 如果你正在使用

            brew upgrade python python3

            具有讽刺意味的是,您实际上是 降级 pip 功能。

            (我发布这个答案,只是因为我的 mac osx 中的 pip 没有 --target 选项,我花了几个小时来修复它)

            【讨论】:

            • 这个带有明确前缀的答案,以及 ignore-installed 由于以前的努力,为我工作:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed &lt;package-name&gt;
            【解决方案13】:

            用 python3.5 和 pip 9.0.3 测试了这些选项:

            pip install --target /myfolder [包]

            安装所有包,包括 /myfolder 下的依赖项。不考虑依赖包已经安装在 Python 的其他地方。您将从 /myfolder/[package_name] 中找到包。如果您有多个 Python 版本,则不考虑这一点(包文件夹名称中没有 Python 版本)。

            pip install --prefix /myfolder [packages]

            检查是否已安装依赖项。将包安装到 /myfolder/lib/python3.5/site-packages/[packages]

            pip install --root /myfolder [包]

            检查依赖项,如 --prefix 但安装位置将是 /myfolder/usr/local/lib/python3.5/site-packages/[package_name]。

            pip install --user [包]

            将软件包安装到 $HOME: /home/[USER]/.local/lib/python3.5/site-packages Python 会自动从此 .local 路径搜索,因此您无需将其放入 PYTHONPATH。

            => 在大多数情况下 --user 是最好的选择。 如果由于某种原因无法使用主文件夹,请使用--prefix。

            【讨论】:

            • 在python 2.7.16下运行,--target(或--prefix)例如安装Jinja2-2.10.1.dist-info/,而安装--install-option="--prefix安装 Jinja2-2.10.1-py2.7.egg-info/,这是我真正想要的
            • 并不总是通过environment variables工作。
            【解决方案14】:

            pip install /path/to/package/

            现在可以了。

            这与使用-e--editable 标志的区别在于-e 链接到包的保存位置(即您的下载文件夹),而不是将其安装到您的python 路径中。

            这意味着如果您将包删除/移动到另一个文件夹,您将无法使用它。

            【讨论】:

            • 这没有回答问题
            • 这让您可以在您放入的路径中安装“本地”包。
            【解决方案15】:
            pip install packageName -t pathOfDirectory
            

            pip install packageName --target pathOfDirectorty
            

            【讨论】:

              【解决方案16】:
              pip3 install "package_name" -t "target_dir"
              

              来源 - https://pip.pypa.io/en/stable/reference/pip_install/

              -t 开关=目标

              【讨论】:

              • @merv 它是不同的,因为它不一样。不是吗?
              【解决方案17】:

              system` 选项,它将 pip package-bins 安装到所有用户都可以访问的 /usr/local/bin。没有此选项的安装可能不适用于所有用户,因为事情会转到用户特定的目录,如 $HOME/.local/bin,然后是用户特定的安装,必须为所有用户重复,如果未设置,也可能存在路径问题对于用户,那么垃圾箱将不起作用。因此,如果您正在寻找所有用户 - 您需要拥有 sudo 访问权限:

              sudo su - 
              python3 -m pip install --system <module>
              logout
              log back in 
              which <module-bin> --> it should be installed on /usr/local/bin/
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-04-27
                • 1970-01-01
                • 1970-01-01
                • 2013-06-17
                • 1970-01-01
                • 2017-05-12
                • 2020-05-01
                相关资源
                最近更新 更多