模块名与目录名不同?

2024-05-16 15:41:50 发布

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

假设我有一个名为bestpackage的python包。

惯例规定bestpacakge也是sys.path上的一个目录,其中包含一个__init__.py,使解释器假设可以从中导入。

有什么方法可以为包名设置一个变量,以便可以将目录命名为与我导入它时使用的指令不同的名称吗?有没有什么方法可以让命名空间不关心目录名,而使用其他配置呢?

我的超级时尚的客户端开发人员非常喜欢我们的一个小型项目的性感项目名称!

编辑

为了澄清,我的问题的主要目的是允许我的客户端人员继续使用他们现有的约定(some.app.js)调用他们“projects”(我们都添加到路径中的那个)文件夹中的目录,即使在某些情况下,它们实际上是python包,将在路径上并在内部源于import语句。我意识到这实际上是一件非常可怕的事情,所以出于好奇我问了更多。因此,这里的一个大问题是避免了这样一个事实,即目录名中的.(因此是假定的包名)意味着属性访问。我并不感到惊讶,这是无法解决的,我只是好奇,如果它可能在进口背后的“魔术”更深。

这里有一些很好的响应,但都依赖于执行某种经典的导入,其中属性访问器.将与目录名冲突。


Tags: path方法py路径目录客户端属性init
3条回答

带有__init__.py文件的目录称为

不,包名始终与目录名相同。这就是Python发现包的方法,它将包与搜索路径上找到的目录名匹配,如果该目录中有一个__init__.py文件,它将找到匹配项并导入包含的__init__.py文件。

您始终可以使用from module import somethingimport module as alias语法,以较短、更易于使用的名称将某些内容导入本地模块命名空间:

from something.otherthing.js import foo
from something.otherthing import js as bar
import something.otherthing.js as hamspam

实际上是的! 你可以做一个规范的import Whatever或者newmodulename = __import__("Whatever")

python会跟踪您的模块,您可以通过执行以下操作来检查:

import sys
print sys.modules

请参阅this article更多详细信息

但这也许不是你的问题?让我们猜猜:您有一个模块位于不同的路径中,而您当前的项目无法访问该模块,因为它不在sys路径中?

好吧,只需加上:

import sys
sys.path.append('path_to_the_other_package_or_module_directory')

在您的import语句之前,或者查看这个SO-post以获得更持久的解决方案。

有一个解决方案需要在某处进行一次初始导入

>>> import sys
>>> sys.modules['blinot_existing_blubb'] = sys
>>> import blinot_existing_blubb
>>> blinot_existing_blubb
<module 'sys' (built-in)>

如果不更改导入机制,则无法从其他名称导入。我认为这是为了让Python更容易理解。

但是,如果要更改导入机制,我建议您这样做:Getting the Most Out of Python Imports

相关问题 更多 >