Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 强制从当前目录导入模块_Python - Fatal编程技术网

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