【问题标题】:how to set different PYTHONPATH variables for python3 and python2 respectively如何分别为 python3 和 python2 设置不同的 PYTHONPATH 变量
【发布时间】:2016-03-08 01:58:59
【问题描述】:

我只想将特定的库路径添加到 python2。但是,将export PYTHONPATH="/path/to/lib/" 添加到我的.bashrc 后,执行 python3 会出现错误:您的 PYTHONPATH 指向 Python 2.x 的站点包目录,但您正在运行 Python 3.x!

我认为这是因为 python2 和 python3 共享共同的PYTHONPATH 变量。

那么,我可以分别为 python2 和 python3 设置不同的PYTHONPATH 变量吗?如果没有,如何将库路径专门添加到特定版本的 python?

【问题讨论】:

标签: python pythonpath


【解决方案1】:

如果您不想在lib/site-packages 中移动/添加文档,请尝试在您要运行的python2.7 脚本中添加两行代码(如下。)

import sys
sys.path = [p for p in sys.path if p.startswith(r'C:\Python27')]

这样,每次运行代码时都会更新 PYTHONPATH(忽略所有 python3.x 包)。

【讨论】:

  • 硬编码的 Windows 默认路径不可移植,即使在某些 Windows 安装中也不正确。也许改为检查sys.version
【解决方案2】:

我发现没有办法修改PYTHONPATH,只针对python2或者只针对python3。我必须使用.pth file

我必须做的是:

  • 确保在我家中创建目录:$HOME/.local/lib/python${MAJOR_VERSION}.${MINOR_VERSION}/site-packages
  • 在该目录中创建一个.pth 文件
  • 测试您的.pth 文件是否正常工作
  • 完成

有关 `.pth 的更多信息。文件语法及其工作原理请参见:python2 docspython3 docs

(.pth文件简而言之:当你的python解释器启动时,它会在某些目录中查看.pth文件,打开这些文件,解析文件,并将这些目录添加到你的sys.path(即与PYTHONPATH 的行为相同,并使位于这些目录中的任何 python 模块可用于正常导入。)

【讨论】:

【解决方案3】:

您可以在lib/site-packages(Windows 上)或lib/pythonX.Y/site-packages(Unix 和Macintosh 上)下创建一个配置文件mymodule.pth,然后添加一行包含要添加到python 路径的目录。

来自docs.python2docs.python3

路径配置文件是名称格式为name.pth的文件,存在于上述四个目录之一中;它的内容是要添加到sys.path 的附加项目(每行一个)。不存在的项目永远不会添加到sys.path,并且不会检查项目是否引用了目录而不是文件。没有项目被添加到 sys.path 超过一次。空白行和以 # 开头的行将被跳过。以import(后跟空格或制表符)开头的行将被执行。

【讨论】:

    【解决方案4】:

    PYTHONPATH 就包管理而言有点像 hack。一个“漂亮”的解决方案是打包你的库并安装它。

    这听起来可能比实际更棘手,所以让我告诉你它是如何工作的。

    假设您的“包”有一个名为 wow.py 的文件,并且您将其保存在 /home/user/mylib/wow.py 中。

    使用以下内容创建文件/home/user/mylib/setup.py

    from setuptools import setup
    
    setup(name="WowPackage",
          packages=["."],
    )
    

    就是这样,现在您可以将您的包“正确安装”到您选择的 Python 发行版中,而无需担心PYTHONPATH。就“正确安装”而言,您至少有三个选择:

    • “非常正确”。将您的代码复制到您的 python 站点包目录:

      $ python setup.py install
      
    • “发展”。只会将 python 站点包中的链接添加到/home/user/mylib。这意味着对目录中代码的更改将生效。

      $ python setup.py develop
      
    • “用户”。如果您不想写入系统目录,您可以将包(“正确”或“处于开发模式”)安装到/home/user/.local 目录,Python 也会在其中自行找到它们。为此,只需将--user 添加到命令中即可。

      $ python setup.py install --user
      $ python setup.py develop --user
      

    要删除以开发模式安装的软件包,请执行以下操作

    $ python setup.py develop -u
    

    $ python setup.py develop -u --user
    

    要删除“正确”安装的软件包,请执行

     $ pip uninstall WowPackage
    

    如果您的包比单个文件更有趣(例如,您有子目录等),只需在 setup 函数的 packages 参数中列出它们(您需要递归地列出所有内容,因此您将对较大的库使用辅助函数)。一旦掌握了窍门,请务必阅读a more detailed manual

    最后,将你的包贡献给 PyPI —— 就像调用 python setup.py sdist register upload 一样简单(不过你需要一个 PyPI 用户名)。

    【讨论】:

    • 这类似于.pth 文件解决方案,因为我们直接将一些内容添加到默认目录中。
    • 当然,底层是这样实现的。好处在于使用方便的高级抽象,即“包”,以及标准命令行界面。
    • 我只是在评论这两种解决方案。使自定义库成为实际的库/包也是一个很好的解决方案,并且在许多情况下它会更合适。它更简洁,但不如 .pth 那样快速和灵活。
    • 不要忘记__init__.py,即使python3不需要它,在创建这个pkg时 - 它以后将无法导入它......(至少对我来说)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2015-06-13
    相关资源
    最近更新 更多