Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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_Python 3.x_Python Import_Python Module - Fatal编程技术网

如何使用相对导入将python脚本拆分为多个文件?

如何使用相对导入将python脚本拆分为多个文件?,python,python-3.x,python-import,python-module,Python,Python 3.x,Python Import,Python Module,我有import.py脚本。我想将一些代码提取到一个单独的文件中,例如,m1.py: $ ls import.py m1.py $ cat import.py from .m1 import a a() $ cat m1.py def a(): print('it works') $ python import.py Traceback (most recent call last): File "import.py", line 1, in <module>

我有
import.py
脚本。我想将一些代码提取到一个单独的文件中,例如,
m1.py

$ ls
import.py  m1.py

$ cat import.py
from .m1 import a
a()

$ cat m1.py
def a():
    print('it works')

$ python import.py
Traceback (most recent call last):
  File "import.py", line 1, in <module>
    from .m1 import a
ModuleNotFoundError: No module named '__main__.m1'; '__main__' is not a package
$ls
import.py m1.py
$cat import.py
从m1导入a
()
$cat m1.py
定义a():
打印('它有效')
$python import.py
回溯(最近一次呼叫最后一次):
文件“import.py”,第1行,在
从m1导入a
ModuleNotFoundError:没有名为“\uuuu main\uuuu.m1”的模块__main__;不是一个包

当我切换到绝对导入时,它会工作。但我不想意外地导入其他模块。我想确保已导入脚本目录中的模块。我如何让它工作?或者我做错了什么?

在m1.py所在的目录中添加
\uuuu init\uuuu.py


编辑:将其作为前一个工作目录中的包运行<代码>光盘..&&python-m prev_dir.import

如果不重写内置模块。默认情况下,python首先在当前目录中查找要导入的文件名。因此,如果在另一个目录中有另一个脚本具有相同的名称,那么只有当前目录中的脚本才会被导入

然后,可以使用绝对导入进行导入

from m1 import a
a()
有关在python中导入的更多信息,您可以查看post out

以确保导入的不是内置的。您可以在当前目录中创建自己的包,例如“my_package”,并在其中移动模块m1。然后,您可以通过以下方式导入:

from my_package import m1
m1.a()

您可能会在此处添加,相对导入位于主模块中。表示“导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,则在变量给定的目录列表中搜索名为spam.py的文件。”所以我不能用脚本目录中的模块覆盖内置模块。是的,您正在编写。如果您重写位于其中一个路径目录的模块,我上面所说的将起作用。您可以通过创建自己的包来确保。在当前目录中,在该文件夹中创建一个名为“my_package”的文件夹,创建一个“\uuu init\uuuuuuuuuuuupy”.py,然后将m1.py文件移动到my_package文件夹中。然后从我的_包import m1.a()中导入,我只是在纠正你的话(答案中关于内置模块的话)。我更喜欢你的答案。至于创建一个包,那会有什么区别呢?其实没什么,创建一个包只是一种组织模块的方法。您可以在一个包中对相关模块进行分组。因此,您可以有一个包,每个包包含一些模块,而不是用一堆单独的文件填充主目录。例如:我可以创建一个包“Communication”,其中包含我的主脚本与之通信的所有模块,等等。不,不是这样的,我不想用它来覆盖内置模块。这更多的是寻址要导入的模块的完整路径。因此,我们不只是指定模块的名称,而是指定模块所在的父包。导入这样的内置模块的唯一方法是,如果有一个名为my_package的内置包\模块,并且在该包内有一个名为m1的模块。