【问题标题】:PYTHONPATH vs. sys.pathPYTHONPATH 与 sys.path
【发布时间】:2010-12-26 00:02:38
【问题描述】:

我和另一位开发人员不同意应该使用 PYTHONPATH 还是 sys.path 来允许 Python 在用户(例如开发)目录中查找 Python 包。

我们有一个具有典型目录结构的 Python 项目:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

在script.py中,我们需要做import package.lib。当包安装在site-packages中时,script.py可以找到package.lib

但是,当从用户目录工作时,需要做其他事情。我的解决方案是将我的PYTHONPATH 设置为包含"~/Project"。另一个开发者想把这行代码放在script.py的开头:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

这样 Python 就可以找到 package.lib 的本地副本。

我认为这是一个坏主意,因为这条线只对开发人员或从本地副本运行的人有用,但我无法给出一个坏主意的充分理由。

我们应该使用PYTOHNPATHsys.path,还是两者都可以?

【问题讨论】:

  • 似乎投票和答案的分配相当平均,并且略微倾向于使用 PYTHON_PATH,尽管这可能是对问题的采样噪音或无意的偏见。
  • 关于PATHsys.path(间接PYTHONPATH)之间的区别参见stackoverflow.com/questions/25344841/sys-path-vs-path

标签: python python-import pythonpath sys.path


【解决方案1】:

如果修改路径的唯一原因是开发人员在他们的工作树中工作,那么您应该使用安装工具为您设置环境。 virtualenv 非常流行,如果您使用的是 setuptools,您可以简单地运行 setup.py develop 在您当前的 Python 安装中半安装工作树。

【讨论】:

  • 您能否对此提供更多说明?即使你建立了一个 conda / virtualenv 环境,这如何将顶层目录放在你的 python 路径上?
【解决方案2】:

我讨厌 PYTHONPATH。我发现在每个用户的基础上设置(特别是对于守护程序用户)并在项目文件夹移动时跟踪它是脆弱和烦人的。我宁愿在独立项目的调用脚本中设置sys.path

但是sys.path.append 不是这样做的方法。您可以轻松获得重复文件,并且它不会整理 .pth 文件。更好(更易读):site.addsitedir

script.py 通常不是更合适的地方,因为它您要在路径上提供的包中。库模块当然不应该接触sys.path 本身。相反,您通常会在用于实例化和运行应用程序的包之外有一个 hashbanged-script,在这个简单的包装脚本中,您可以放置​​诸如 sys.path-frobbing 之类的部署详细信息。

【讨论】:

  • site.addsitedir 的问题在于它在sys.path 上执行了append,这意味着已安装的包将优先于开发中的本地包(并且可能会拉扯头发)。需要sys.path.insert(0... 来克服这个问题。
  • @EliBendersky:应该是sys.path.insert(1stackoverflow.com/q/10095037/125507
【解决方案3】:

一般来说,我会考虑设置一个环境变量(如 PYTHONPATH) 成为一种不好的做法。虽然这对于一次性调试可能没问题,但将其用作
定期练习可能不是一个好主意。

当某些人使用环境变量时,会导致“它对我有用”这样的情况
else 报告代码库中的问题。也可以进行相同的做法与 测试环境也是如此,导致测试运行良好的情况 特定的开发人员,但在有人启动测试时可能会失败。

【讨论】:

    【解决方案4】:

    除了已经提到的许多其他原因,您还可以指出硬编码

    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

    很脆弱,因为它假定了 script.py 的位置——只有当 script.py 位于 Project/package 中时它才会起作用。如果用户决定将 script.py (几乎)移动/复制/符号链接到其他任何地方,它将中断。

    【讨论】:

      【解决方案5】:

      我认为,在这种情况下,使用 PYTHONPATH 更好,主要是因为它不会引入(有问题的)不必要的代码。

      毕竟,如果你想一想,你的用户不需要sys.path这个东西,因为你的包将被安装到站点包中,因为你将使用一个打包系统.

      如果用户选择从“本地副本”运行,正如您所说,那么我观察到,通常的做法是声明,如果在外部使用包需要手动添加到 PYTHONPATH网站包。

      【讨论】:

        【解决方案6】:

        由于上述原因,破解PYTHONPATHsys.path 都不是一个好主意。对于将当前项目链接到 site-packages 文件夹,实际上有比python setup.py develop 更好的方法,正如here 所解释的那样:

        pip install --editable path/to/project

        如果您的项目的根文件夹中还没有 setup.py,那么从这个开始就足够了:

        from setuptools import setup
        setup('project')
        

        【讨论】:

          猜你喜欢
          • 2014-06-27
          • 2021-04-10
          • 1970-01-01
          • 2017-07-14
          • 2012-08-25
          • 2013-04-13
          • 1970-01-01
          相关资源
          最近更新 更多