Python 模块之间的相对导入
我编写了一组用于计算的函数,并将它们组织在一些.py文件中,比如functions1.py和functions2.py。在同一文件夹中,我还有另一个文件main.py,然后: 假设我有以下代码:Python 模块之间的相对导入,python,python-import,relative-import,Python,Python Import,Relative Import,我编写了一组用于计算的函数,并将它们组织在一些.py文件中,比如functions1.py和functions2.py。在同一文件夹中,我还有另一个文件main.py,然后: 假设我有以下代码: import numpy as np def mycos(x): return np.cos(x) def mysin(x): return np.sin(x) 而在functions2.py中: 现在假设main.py包含: 然后,如果执行main.py,则会出现以下错误: T
import numpy as np
def mycos(x):
return np.cos(x)
def mysin(x):
return np.sin(x)
而在functions2.py中:
现在假设main.py包含:
然后,如果执行main.py,则会出现以下错误:
Traceback (most recent call last):
File "functions2.py", line 6, in <module>
from .functions1 import mysin, mycos
ImportError: attempted relative import with no known parent package
在使用相对导入时,我遗漏了什么吗?我认为这是因为当您运行未在项目目录中执行的代码时,请尝试在main.py的代码开头添加这几行 导入操作系统如果已经导入操作系统,则不添加此行 os.chdiros.path.dirnameos.path.abspath\uu文件__ 让我知道这是否有效,如果无效。。。你能分享完整的代码来更好地理解你的问题吗 编辑 问题应该是文件functions1.py和functions2.py实际上不是模块,为了解决这个问题,我将向您推荐两种解决方案: 创建文件夹 由于这两个函数文件不是作为一个模块,所以创建一个文件夹并将它们像这样放在其中 代码是这样的 main.py
import numpy as np
from functions.functions2 import mytan
angle = np.pi/3
if mytan(angle) == np.tan(angle):
print('OK')
函数1.py
import numpy as np
def mycos(x):
return np.cos(x)
def mysin(x):
return np.sin(x)
函数2.py
from .functions1 import mysin, mycos
def mytan(x):
return mysin(x)/mycos(x)
使用uuu init_uuuuu.py
这就是代码
init.py
以及所有其他文件,就像第一个解决方案一样
请注意,此解决方案有点长,但这应该是最正确的方法
然后?
如果你想更好地理解为什么它不起作用,我建议你阅读这篇文章:
Cheers J.Bloom我认为这是因为当您运行未在项目目录中执行的代码时,请尝试在main.py代码的开头添加这几行代码 导入操作系统如果已经导入操作系统,则不添加此行 os.chdiros.path.dirnameos.path.abspath\uu文件__ 让我知道这是否有效,如果无效。。。你能分享完整的代码来更好地理解你的问题吗 编辑 问题应该是文件functions1.py和functions2.py实际上不是模块,为了解决这个问题,我将向您推荐两种解决方案: 创建文件夹 由于这两个函数文件不是作为一个模块,所以创建一个文件夹并将它们像这样放在其中 代码是这样的 main.py
import numpy as np
from functions.functions2 import mytan
angle = np.pi/3
if mytan(angle) == np.tan(angle):
print('OK')
函数1.py
import numpy as np
def mycos(x):
return np.cos(x)
def mysin(x):
return np.sin(x)
函数2.py
from .functions1 import mysin, mycos
def mytan(x):
return mysin(x)/mycos(x)
使用uuu init_uuuuu.py
这就是代码
init.py
以及所有其他文件,就像第一个解决方案一样
请注意,此解决方案有点长,但这应该是最正确的方法
然后?
如果你想更好地理解为什么它不起作用,我建议你阅读这篇文章:
Cheers J.Bloomos.chdiros.path.dirnameos.path.abspath\uu文件建议做的是将工作目录更改为main.py的父文件夹。这看起来很混乱,可能会以微妙的方式失败——相对路径就是其中之一。正确的解决方案是使用根目录的父目录中的-m开关运行main.py。这实际上是运行python脚本的推荐方式。因此,您应该运行:
$ python -m root.main # from parent dir of root
然后,模块main作为根包的一部分运行,根包在您的案例中缺少父包
注意:如果您创建一个子包根,这仍然有效。函数,如上所述-最新py3不需要添加_init _uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这看起来很混乱,可能会以微妙的方式失败——相对路径就是其中之一。正确的解决方案是使用根目录的父目录中的-m开关运行main.py。这实际上是运行python脚本的推荐方式。因此,您应该运行:
$ python -m root.main # from parent dir of root
然后,模块main作为根包的一部分运行,根包在您的案例中缺少父包
注意:如果您创建一个子包根,这仍然有效。函数,如上所述-最新的py3不需要添加_init _uuuuuuuuuuy.py,但为了清晰起见,添加它是一个好主意。谢谢,我已经修改了这个问题,希望现在问题更清楚。无论如何,我已经验证了运行是在正确的文件夹中执行的。好的,如果不是问题,我将把这个解决方案留在这里,因为在大多数类似的情况下,它应该是有效的。谢谢,我已经修改了这个问题,希望它现在更清楚。无论如何,我已经验证了运行是否在正确的文件夹中执行。好的,如果没有问题,我将把这个解决方案留在这里,因为在大多数类似情况下,它应该是workRelative import已经有很多答案了:,等等@andrew-94我没有收到任何反馈:我的回答解决了你的问题吗?这与python中相对导入的工作方式有关。有关解决方案,请参阅。这是否回答了您的问题?相对导入已经有很多答案:,,等等@andrew-94我没有收到任何反馈:我的答案解决了你的问题吗?它与相对导入在python中的工作方式有关。请参阅以获取解决方案。请执行以下操作: 这能回答你的问题吗?
import functions1, functions2
$ python -m root.main # from parent dir of root