问题标签 [relative-import]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6532 浏览

python - 项目内的相对导入导致“系统错误:未加载父模块,无法执行相对导入”

我正在开发一个具有以下结构的项目:

根据PEP 328 ,相对进口是可能的。但是,当我在同一目录中启动 Python(在 shell 中)a.py并执行以下命令时:

from ..config import *

from ...project import *

我收到以下错误:

我知道import *不建议这样做,它仅用于测试(尝试导入配置)。

0 投票
2 回答
1240 浏览

python - Python 相对导入找不到包

我确信这是一个非常简单的问题,而且我只是遗漏了一些非常明显的东西,但是这个困境的答案已经让我想了好几个小时。

我的项目目录结构如下所示:

除了对我的命名约定和目录结构的批评外,我似乎无法使用相对导入。我正在尝试相对导入要在 AvgAccelUnitTest.py 中测试的模块文件:

但是,我不断得到:

由于我在整个结构中都设置了所有init文件,并且我还将顶层目录添加到了我的 PYTHONPATH 中,所以我很难过。为什么 python 不能正确解释包和导入文件?

0 投票
2 回答
62993 浏览

python - 尝试相对导入超出顶级包

这是我的文件夹结构:

test_bash\__init__.py我有:

test_bsa_files.py

现在当我发出:

我得到:

由于“Mopy”在 sys.path 中并且bosh\__init__.py已正确解决,为什么它抱怨顶级包之上的相对导入?哪个是顶级包

顺便说一句,这是我向遗留项目添加测试的尝试——在Python 测试包布局中询问过,但作为Python 单元测试在哪里的副本而被关闭?. 非常感谢对我当前测试包布局的评论!


那么下面的答案在我的情况下不起作用:

模块bash.py 是应用程序的入口点,其中包含:

当我使用import bash.boshfrom bash import bosh得到:

此用法消息来自 bash 中的 main()。

0 投票
0 回答
359 浏览

python - 内置 python 的 __import__ vs imp.load_module: ValueError: Attempted relative import beyond toplevel package

我有一段代码可以动态导入一堆子包 - 包结构:

使用该__import__函数(免责声明:我没有编写该代码,我只是当前的维护者):

这工作得很好。

现在我试图用imp.load_module做同样的事情(试图回答我的另一个问题):

但这失败了:

我想答案在__import__'s docs 的某个地方,我们在其中读到:

该函数导入模块名称,可能使用给定的全局变量和局部变量来确定如何在包上下文中解释名称。fromlist 给出了应该从 name 给定的模块导入的对象或子模块的名称。标准实现根本不使用它的 locals 参数,并且只使用它的 globals 来确定 import 语句的包上下文

所以:

  • 是否可以imp.load_module使用一组不同的参数进行调用,以便知道顶级包确实不是 game/gameX ?

有关的:

0 投票
1 回答
454 浏览

python - Python:奇怪的导入行为

我有一个具有以下结构的包

请注意,项目文件夹和源文件夹共享相同的名称 (projectX)。

问题有点复杂,需要做一些前提

前提:

我总是启动界面并且总是启动界面。没有调用其他脚本

我的问题首先出现在尝试从 stats_worker2 导入 main_worker 时。

我无法让它作为相对进口。因此,我尝试从 stats_worker2 和接口(分别)将父目录附加到 sys.path。我尝试了各种我不记得的方法。

它最终通过将以下行添加到 stats_worker2 来工作

现在怪事开始了

在调用脚本几次之后(我不记得具体有多少次),上面的 sintax 不再起作用了。因为有一个:ImportError: No module named projectX

编辑:上面的斜体部分是由于我__init__.py在 projectX 源文件夹中缺少一个。所有其他症状仍然存在。

但是,很奇怪,我现在可以从 stats_worker2 成功导入主要工作人员:

没有任何目录被附加到 sys.path!

但是,Sphinx 不再起作用了!具体来说,它无法导入 projectX 包的所有模块。

额外的怪异

我曾经从界面成功导入stats_worker,现在我仍然可以导入它,但是我的IDE(Pycharm)将导入标记为未使用。它实际上已被使用,如果我评论导入,界面会按预期崩溃(我已经使 Pycharm 缓存无效)

0 投票
1 回答
638 浏览

python - (Python) 相对导入最佳实践 (import x or from . import x)

我正在编写自己的模块mymodule。它包含以下内容:

file1我想导入file2. 首先我使用from . import file2它是因为这似乎是最佳实践 - 因为如果我在命名空间上犯了错误不会有任何问题(例如,当那个 file2 有我已经使用的名称或类似的东西时,如果我想要从子模块导入文件)。


然后我改为使用,只是import file2因为测试对这些相对导入有问题。我已经在这里描述了这个问题。


现在没有 的导入存在问题,因为安装.模块后它们不再起作用。(我把它安装到我自己的电脑上。)


什么是更好的?我如何避免没有导入可能引发的问题.?(我知道,可以注意不要使用已经使用过的名称。但我很难相信可能因为他使用我的模块而导致其他人程序崩溃的事情。

那么:什么是最佳实践?为什么?如果没有这样的东西:在哪里使用什么?

0 投票
0 回答
85 浏览

python - Python 相对导入共享 C++ 库

假设我有一个这样的文件夹结构:

mod1.soC++ 共享库在哪里。在mod2.py我有一个相对导入语句中from ..pgk1 import mod1,并且在run.py我有import lib.pkg2.mod2如果我运行python run.py我得到以下错误:

任何想法为什么导入不起作用?

0 投票
16 回答
759010 浏览

python - 相对导入 - ModuleNotFoundError:没有名为 x 的模块

这是我第一次真正坐下来尝试 python 3,但似乎失败得很惨。我有以下两个文件:

  1. 测试.py
  2. 配置文件

config.py 中定义了一些函数以及一些变量。我已将其简化为以下内容:

配置文件

测试.py

我也有一个__init__.py

但是,我收到以下错误:

我知道 py3 约定是使用绝对导入:

但是,这会导致以下错误:

所以我不知道在这里做什么......非常感谢任何帮助。:)

0 投票
1 回答
1118 浏览

python - 尝试使用 python -m 相对导入超出顶级包

我几乎查看了有关相对导入的每个链接,尤其是那些与顶级包有关的链接,但我仍然在让我的相对导入代码正常工作时遇到很多麻烦。作为参考,我使用的是 Python 3.6。

我有一个要运行的测试目录,隔离在他们自己的目录中,tests。我想将所有模块包导入到一个名为 InputTests.py 的文件中。这是我的项目目录的格式。文件目录

在 InputTests.py 中,我尝试以这种方式导入模块:

from .. import modules

我得到错误:

但是,我使用的是命令:python -m tests.InputTests,它应该告诉解释器从我的顶级目录运行所有内容。所以我想我的问题是,考虑到我是从上面的包中运行它,为什么我的相对导入语句不起作用。这个堆栈溢出帖子似乎详细说明了我需要什么,但是他们使用 -m 运行的解决方案对我不起作用:如何在 Python 中进行相对导入?

此外,在这个堆栈溢出帖子中似乎有一个矛盾:Relative importing modules from parent folder subfolder

后一篇文章似乎暗示了 .. 和 . 的上下文含义。不要根据您执行 Python 命令的位置进行更改,但是前者表示确实如此。这让我非常困惑。任何人都可以澄清相对进口并解决这种差异吗?谢谢你。

0 投票
1 回答
54 浏览

python - 与模块同名的函数的包导入导致相对导入出现重影

我有一个foo_package这样组织的包:

该模块bar.py定义了一个同样命名的“公共”函数bar,并且模块和函数都从准确命名中受益匪浅barbar.py还定义了一些“私有”辅助函数。

在里面__init__.py我做了一个顶级导入,bar.bar所以这foo_package.bar将是整个包的 API。

但现在我被相对进口咬伤了。

首先,如果我正在调试或在 IPython 之类的交互式提示中工作,那么天真的粘贴from .bar import bar是行不通的。我可以通过在内部启动 IPythonfoo_package并改为使用from foo_package import bar来解决这个问题。

但是我怎样才能导入bar 模块而不是导出的bar函数呢?例如变体

等等,都导入函数 bar,同时任何时候bar.py也包含对另一个模块的相对导入,比如

然后是平原

也不会工作。

具有该功能bar 的模块的包级“重影”是正确的行为。在本地开发中(尤其是在像 IPython 这样的交互式环境中)导入模块的同时,我该如何维护这一点?bar bar