在Python 3中管理命名空间的正确方法是什么?

时间:2015-09-03 18:17:29

标签: python python-3.x namespaces

我的大多数编程背景都是用C ++和Java编写的,但出于专业原因,我开始学习Python。我注意到的第一件事就是Python对包和命名空间的新方法,但在谷歌搜索了一段时间并进行了一些实验后,我以为我开始了解它。

然后我读了this,这表明我刚刚学到的一切都是错的。所以现在我又搞糊涂了,而且我很难搞清楚如何组织我的代码。

这是一个非常具体的问题,我不知道如何正确回答任何版本的Python,特别是我不知道答案是否从Python 2改为3。让我们说我想要一个克隆的github仓库中的类,存储在:

/Users/me/my_own_code/some_other_project1/...
/Users/me/my_own_code/some_other_project2/...
/Users/me/my_own_code/some_other_project3/...

但是,让我们说我在这里还有其他一些项目:

tfile = open( 'test', "w" )
pickle.dump(encodedList, tfile)
tfile.close()

每个都使用IWantThisClass。一个策略似乎是每次都只是手动将正确的目录添加到sys.path,但这很麻烦 - 特别是当我只是在Jupyter笔记本中进行实验时。我在google搜索后解决的解决方案是将包目录添加到bash中的PYTHONPATH变量中;这就是"导入IWantThisClass"工作得很好。但是我在上面的Coghlan的帖子中读到了:

  

"下一个陷阱存在于所有当前版本的Python中,包括3.3,并且可以在以下一般准则中总结:'永远不要直接添加包目录或包内的任何目录到Python路径'。"

那么"正确"是什么?解决这个问题的方法?

1 个答案:

答案 0 :(得分:1)

基本上,如果package是您的软件包的顶级目录,则应将包含 package的目录添加到sys.path。如果您要导入的内容不是包而是单个模块(即,只是一个不在包目录中的单个.py文件),那么该模块应该位于sys.path /

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

另一个可能更好的答案是,您应该尽量避免将特定目录添加到sys.path以访问特定文件。相反,您应该尝试安装相关的包,这将让Python为您设置路径。如果您使用的开发包中不希望混乱使用主网站包,则可以使用python setup.py developpip install --editable“就地”安装软件包。 (也就是说,包文件将保持原样,不会移动到全局Python站点包中,安装程序将更新相应的.PTH文件,以便新安装的包可导入。)

简而言之,最终你需要放弃以“此文件希望此类来自其他文件”的方式查看它。您应该关注的单元是可安装的包或模块。如果您正在编写需要SomeClass的代码,则应安装提供SomeClass的包/模块,然后将其导入;不要试图在临时的基础上操纵sys.path来定位你想要的单个文件/类而不安装它的包。 (如前所述,setup.py developpip install --editable允许您在保留实际文件的同时执行此操作。)