模块名称与目录名称不同?

时间:2012-11-06 15:20:00

标签: python pythonpath

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

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

有没有办法可以为包名设置变量,这样可以将目录命名为与我导入的指令不同的名称?有没有办法让namespacing不关心目录名称,而是尊重其他配置?

我的超级时尚客户端开发人员非常喜欢这些性感的something.otherthing.js项目名称,我们的一个较小的项目名称!

修改

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

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

5 个答案:

答案 0 :(得分:12)

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

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

您始终可以使用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

答案 1 :(得分:5)

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

>>> 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

答案 2 :(得分:1)

其实是的! 你可以做一个规范的import Whatevernewmodulename = __import__("Whatever")

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

import sys
print sys.modules

请参阅this article更多详情

但那可能不是你的问题?让我猜一下:你有一个不同路径的模块,当前项目无法访问,因为它不在sys-path中?

好吧,只需添加:

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

在您的import声明之前或看到此SO - post以获得更长久的解决方案。

答案 3 :(得分:0)

好吧,首先我会说Python is not Java/Javascript/C/C++/Cobol/YourFavoriteLanguageThatIsntPython。当然,在现实世界中,我们中的一些人必须回答那些不同意的老板。因此,如果你想要的只是一些间接,那就使用烟雾和镜子,只要他们不太注意引擎盖下的东西。用Python方式编写模块,然后以同事的方式提供一个API,让你的同事想要。例如:

pythonic_module.py

def func_1():
    pass

def func_2():
    pass

def func_3():
    pass

def func_4():
    pass

indirection

/dotty_api_1/__init__.py

from pythonic_module import func_1 as foo, func_2 as bar

/dotty_api_2/__init__.py

from pythonic_module import func_3 as foo, func_4 as bar

现在他们可以点到他们心中的内容,但你可以用引号的方式写下Pythonic的方式。

答案 4 :(得分:0)

我在sdist和安装时间而不是运行时使用setup.py来寻找这种情况,并找到指令package_dir