在Python3中管理名称空间的正确方法是什么?

2024-04-23 19:23:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我的编程背景大多是C++和java,但出于专业的原因,我开始学习Python。我注意到的第一件事是Python对包和名称空间的新方法,但是在google上搜索了一段时间并做了一些实验之后,我认为我开始掌握了它的窍门。在

然后我读了this,这表明我刚刚学到的一切都是错误的。所以现在我又困惑了,我很难弄清楚应该如何组织我的代码。在


这里有一个非常具体的问题,我不知道如何正确回答任何版本的Python,尤其是我不知道答案是否从python2变为3。假设我希望在一个克隆的github repo中有一个类,存储在:

/Users/me/my_teams_code/some_project/package/IWantThisClass.py

但假设我还有其他项目:

^{pr2}$

每个都使用IWantThisClass。一种策略似乎只是手动将正确的目录添加到系统路径每次,但这是相当麻烦的-尤其是当我只是在一个Jupyter笔记本试验。我在搜索之后找到的解决方案是将包目录添加到bash中的PYTHONPATH变量中;这在“import IWantThisClass”工作正常的意义上起作用。但我在科格兰上面的帖子中看到:

"This next trap exists in all current versions of Python, including 3.3, and can be summed up in the following general guideline: 'Never add a package directory, or any directory inside a package, directly to the Python path'."

那么解决这个问题的“正确”方法是什么呢?在


Tags: the方法in目录名称package专业编程
1条回答
网友
1楼 · 发布于 2024-04-23 19:23:33

基本上,如果package是包的顶层目录,那么应该将包含package的目录添加到sys.path。如果一个单独的包{cd3>不是一个单独的目录{cd3>,那么这个包不应该是一个单独的目录

如何添加这些路径是另一个问题。对于要向路径添加一次性内容的情况,我发现最简单的方法是在“站点目录”中创建一个.PTH文件,该文件可以是主站点包目录,也可以是特定于用户的站点包目录。在.PTH文件中,您可以列出其他目录,这些目录随后将被添加到site.path。因此,您可以拥有自己的小my_stuff.pth文件,该文件用您需要的目录设置sys.path。这避免了在每个脚本中添加样板代码来手动修改sys.path。您可以在^{} module的文档中了解如何执行此操作。在

另一个可能更好的答案是,为了访问特定的文件,您应该尽量避免向sys.path添加特定的目录。相反,您应该尝试安装相关的包,这将让Python为您设置路径。如果您使用的是开发中的软件包,您不想让主站点的软件包混乱,那么可以使用^{}或{a3}来“就地”安装这些包。(也就是说,包文件将保留在原来的位置,而不是移动到全局Python站点包中,安装程序将更新相应的.PTH文件,以便新安装的包是可导入的。)

简而言之,最终你需要从“这个文件想要这个类从这个其他文件”的角度来看待它。您应该关注的单元是可安装的包或模块。如果您正在编写需要SomeClass的代码,则应该安装提供SomeClass的包/模块,然后导入它;不要试图在没有安装其包的情况下临时操作sys.path来针对您想要的单个文件/类。(如前所述,setup.py developpip install editable允许您这样做,同时仍将实际文件保留在所需的位置。)

相关问题 更多 >