Python 强制从当前目录导入模块
我有一个包Python 强制从当前目录导入模块,python,Python,我有一个包p,它有模块a和ba依赖于b: b.py内容: import a 但是,我想确保b从同一p包目录导入我的a模块,而不仅仅是从PYTHONPATH导入任何a模块 因此,我试图更改b.py,如下所示: from . import a 只要我在ppackage目录之外导入b,这项功能就会起作用。给定以下文件: /tmp /p a.py b.py __init__.py 以下工作: $ cd /tmp $ echo 'import p.b
p
,它有模块a
和b
<代码>a依赖于b
:
b.py
内容:
import a
但是,我想确保b
从同一p
包目录导入我的a
模块,而不仅仅是从PYTHONPATH
导入任何a
模块
因此,我试图更改b.py
,如下所示:
from . import a
只要我在p
package目录之外导入b
,这项功能就会起作用。给定以下文件:
/tmp
/p
a.py
b.py
__init__.py
以下工作:
$ cd /tmp
$ echo 'import p.b' | python
以下操作不起作用:
$ cd /tmp/p
$ echo 'import b' | python
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "b.py", line 1, in <module>
from . import a
ValueError: Attempted relative import in non-package
$cd/tmp/p
$echo“导入b”| python
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“b.py”,第1行,在
从…起导入
ValueError:尝试在非包中进行相对导入
为什么?
另外,我正在使用Python2.7.3,因为在
/p
中有一个\uuu init\uuu.py
文件。这个文件告诉Python:“这个文件夹中的所有模块都在包p
”中
只要\uuuu init\uuuuu.py
文件存在,您就可以将b
作为p.b
导入,无论您在何处
因此,在
b.py
中正确的导入应该是:import p.a
相对导入只在包内工作
如果您从您所在的位置导入b
,则没有包的概念,因此没有相对导入的方法
如果导入p.b
,则它是包c
中的模块b
重要的不是目录结构,而是包结构。重读Python之后,我最初的问题的正确答案是: 为确保
b
从自己的包中导入a
,只需在b
中写入以下内容即可:
以下是文件中的报价:
子模块通常需要相互引用。例如
环绕声模块可能使用回声模块。事实上,这样的引用
是如此常见,以至于import语句首先在包含
在标准模块搜索路径中查找之前打包。
注意:正如J.F.Sebastian在下面的评论中所建议的,不建议使用隐式导入,事实上,它们已经在Python 3中消失了。哪种版本的Python?这种行为在过去发生了变化。按照您的建议更改
b.py
。现在运行import b
会产生import错误:没有名为p.a
的模块。Python 2.7.3在这种情况下,您不应该使用import b
。始终使用import p.b
或从和import p
提供必要的符号来隐藏内部详细信息。您的问题是,您混合了(旧)相对导入和基于包的新导入。旧的进口商品变化无常,这就是为什么引入了新式进口商品。请参阅中的“包”,那么完成任务的正确方法是什么<代码>在b.py
中导入p.a
?这是可行的,但如果我想将p重命名为其他名称,我必须更改很多文件…不要使用隐式相对导入(它们在Python 3中已经消失)。始终使用绝对导入(from p import a
(如果存在p/p.py
文件,则在其前面添加from\uuuuuu future\uuuu import绝对\uu import
)或显式相对导入(from.import a
(如果它不是\uuu主模块))。不要从Python包目录中运行脚本;它将此目录前置到sys.path,这可能导致同一模块在不同名称下可用,从而导致与模块级状态相关的错误(如果使用隐式相对导入;在这种情况下,它还将隐藏其他顶级模块)。
import a