和我不同意关于是否PYTHONPATH或sys.path中的另一种显影剂应被用于允许Python来找到在用户Python包(例如,发展)目录。

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

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

在script.py,我们需要做的import package.lib。当包装被安装在站点包,script.py可以找到package.lib

从用户目录中工作时,但是,别的东西需要做的事情。我的解决方法是设置PYTHONPATH我向包括“〜/项目”。另一个显影剂希望把下面这行代码在script.py的开头:

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

这样Python才能找到package.lib的本地副本。

我觉得这是一个坏主意,因为这行只对开发商或从本地副本运行有用的人,但我不能给出很好的理由,为什么这是一个坏主意。

我们应该使用PYTOHNPATH,sys.path中,或者是任一细

有帮助吗?

解决方案

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

其他提示

我讨厌PYTHONPATH。我觉得很脆,恼人的设置在每个用户的基础上(尤其是守护进程的用户)和跟踪的项目文件夹中走动。我宁愿设置sys.path在独立的项目调用脚本。

然而sys.path.append是不这样做的方式。你可以很容易地得到重复,不理清.pth文件。更好(更可读的):site.addsitedir

script.py通常不会更合适的地方做它,因为它的的你要提供路径上的包。库模块当然不应被触及sys.path自己。取而代之的是,你通常有一个可用来实例化并运行应用程序包之外的hashbanged脚本,它是在这个简单的包装脚本,你就会把部署的细节,如sys.path-frobbing。

在一般我会考虑的环境变量的设置(如PYTHONPATH) 是一种不好的做法。虽然这可能是罚款,一次性的调试,但以此作为结果 常规的作法可能不是一个好主意。

环境变量的使用会导致情况,如“我的作品”当有人点击 其他报告代码库中的问题。另外一个可能携带用同样的做法 测试环境为好,导致像一个运行良好的测试情况 尤其是开发商,但是当有人启动测试可能失败。

随着已经提到的诸多原因,你也可以点OUTH是硬编码

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

是脆性的,因为它假设script.py的位置 - 如果script.py位于项目/包它将只工作。如果用户决定移动/复制/符号链接script.py(几乎)这将打破其他地方。

我认为,在这种情况下使用PYTHONPATH是一个更好的东西,主要是因为它不引入(可疑)不必要的代码。

毕竟,如果你想起来了,你的用户的不需要那么sys.path的事情,因为你的包将得到安装到站点包,因为您将使用包装系统。

如果用户选择从一个“本地副本”运行,如你调用它,然后我观察到的是,通常的做法是状态,该包需要被手动添加到PYTHONPATH,如果使用的话外的站点包。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top