22

假设我有一个名为bestpackage.

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

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

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

编辑

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

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

4

5 回答 5

16

包含__init__.py文件的目录称为

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

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

from something.otherthing.js import foo
from something.otherthing import js as bar
import something.otherthing.js as hamspam
于 2012-11-06T15:22:53.490 回答
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

于 2012-11-06T19:59:51.383 回答
2

好吧,首先我会这么说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 的方式编写东西。

于 2012-11-06T15:30:40.423 回答
1

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

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

import sys
print sys.modules

这篇文章更多细节

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

好吧,只需添加:

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

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

于 2012-11-06T15:30:50.147 回答
1

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

于 2017-06-25T00:49:26.017 回答