代码之家  ›  专栏  ›  技术社区  ›  minou

PYTHONPATH与sys.path

  •  72
  • minou  · 技术社区  · 15 年前

    另一个开发者和我不同意 PYTHONPATH sys.path 应用于允许Python在用户(例如开发)目录中查找Python包。

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

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

    在script.py中,我们需要 import package.lib package.lib .

    然而,当从用户目录工作时,需要做一些其他的事情。我的解决办法是设置我的 蟒蛇 包括 "~/Project"

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

    这样Python就可以找到 package.lib .

    我认为这是一个坏主意,因为这行代码只对开发人员或使用本地副本运行的人有用,但我不能给出一个好的理由来说明这是一个坏主意。

    我们应该使用 PYTOHNPATH 搜索路径 ,还是两者都好?

    5 回复  |  直到 4 年前
        1
  •  43
  •   Ned Batchelder    15 年前

    如果修改路径的唯一原因是开发人员从他们的工作树工作,那么您应该使用安装工具为您设置环境。virtualenv非常流行,如果您使用的是setuptools,那么只需运行 setup.py develop

        2
  •  38
  •   bobince    15 年前

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

    sys.path.append 这不是做这件事的方法。你可以很容易地得到重复的,而且它不会分类 .pth 文件夹。更好(更具可读性): site.addsitedir .

    script.py 通常不会是更合适的地方,因为 要在路径上提供的包。库模块当然不应接触 他们自己。相反,您通常会在用于实例化和运行应用程序的包之外有一个散列脚本,在这个简单的包装器脚本中,您会将部署细节放在如下位置 搜索路径 -蹦跳。

        3
  •  12
  •   sateesh    15 年前

    这是一个坏习惯。虽然这对于一次性调试来说是不错的,但是使用它作为

    使用环境变量会导致一些情况,如“它对我有用”时
    特定的开发人员,但当有人启动测试时可能会失败。

        4
  •  9
  •   unutbu    15 年前

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

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

        5
  •  5
  •   shylent    15 年前

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

    毕竟,如果你想一想,你的 用户 不需要那个 sys.path

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

        6
  •  4
  •   Peter    5 年前

    都不是黑客 PYTHONPATH 也没有 sys.path 由于上述原因,这是一个好主意。要将当前项目链接到SitePackages文件夹,实际上有一种比 python setup.py develop 如前所述 here :

    pip install --editable path/to/project

    from setuptools import setup
    setup('project')