我有 2 个文件在一个包中,将 1-2 个函数从每个文件拉到另一个文件会很方便。在init .py 我试过:
from mappings import *
from get_models import *
在 mappings.py 中:
#!/usr/bin/env python
import os, sys, re
sys.path.append('/home/cchilders/scripts/python/work-tasks/unit_tests_scripts/completed')
from . import get_model_name_or_None
在 get_models.py 中:
#!/usr/bin/env python
import os, re, sys
sys.path.append('/home/cchilders/scripts/python/work-tasks/unit_tests_scripts/completed')
from . import process_model
而不是命名空间冲突或诸如此类,我实际上得到:
[cchilders@localhost completed]$ ./mappings.py
Traceback (most recent call last):
File "./mappings.py", line 7, in <module>
from . import get_model_name_or_None
ValueError: Attempted relative import in non-package
这让我感到惊讶,我什至对我的包有足够的偏执,将它附加到 sys.path。当我尝试从一个文件导入另一个文件时,不通过init .py 并将 init 留空,我的导入工作。我想知道:
python 如何在您的文件结构中查找包(这不是 django 应用程序,只是常规文件夹)?那么我对 sys.path 的附加是不必要的吗?
为什么我不能将名称放入包命名空间并将它们导入每个单独的模块中?我什至尝试改变
from mappings import *
from get_models import *
为了更安全from get_models import get_model_name_or_None
,我得到与上面完全相同的错误
谢谢
我的init .py 为空,mappings.py:
#!/usr/bin/env python
import os, sys, re
(初始化为空,不附加我的路径,不尝试映射中的任何导入,get_model 正在正确地从映射中导入函数)我得到:
[cchilders@localhost completed]$ python -m mappings.py
*correct output*
/usr/bin/python: No module named mappings.py
正确的输出是像以前一样运行的代码(如预期的那样),但我收到警告 no module。奇怪的是,当我取消注释我的附加:
sys.path.append('/home/cchilders/scripts/python/work-tasks/unit_tests_scripts/completed')
我仍然得到完全相同的正确输出,然后是警告/usr/bin/python: No module named mappings.py
尝试在 get_models 中使用映射也很困难:
使用
import mappings
空初始化会导致NameError: name 'mappings' is not defined
在我的初始化中使用
import mappings
withimport mapping
也会导致相同NameError: name 'mappings' is not defined
在我的 init 中使用
import mappings
但不在get_models.py
并尝试调用mappings.process_model
产量get_models
:NameError: global name 'mappings' is not defined