问题标签 [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.
python - 模块之间的相对导入
我编写了一组我想用于计算的函数,并将它们组织在一些 .py 文件中,比如functions1.py
和functions2.py
. 在同一个文件夹中,我还有另一个文件main.py
,然后:
里面functions1.py
假设我有以下代码:
在里面functions2.py
:
现在假设main.py
包含:
然后,如果我执行main.py
我得到以下错误:
我在使用相对导入时错过了什么吗?
python - 让 PyLint 和 VSCode 自动补全理解相对导入
在我的 Python 项目中,我想导入一个.so
名为 writeexample.cpython-38-x86_64-linux.so
并pybind11
存储在名为bin
.
为此,我import bin.example as example
在执行脚本时使用 which 工作得很好。
然而,无论是 PyLint 还是 VSCode 的自动完成功能似乎都无法识别这种相对导入。他们只是在我的导入声明下不断给我波浪线,并且没有任何自动完成功能。
有没有办法让他们了解当前的模块,或者有一种完全不同的、更优雅的方式来包含我的库?
python - 在子目录中运行脚本时从上一级目录导入模块
假设我在一个目录结构中为了方便而组织了一组脚本,如下所示:
foo.py
并且bar.py
是脚本在做不同的事情,但它们都data.txt
以相同的方式加载它们的不同。为了避免重复自己,我希望load_data()
在helpers.py
子目录dir_a
和dir_b
.
我曾尝试dir_a/foo.py
使用这样的相对导入来导入助手:
但是直接foo.py
作为脚本运行在第 1 行失败,并带有ImportError
:
我在 python 中尝试的精神是否可行(即简单且无需修改sys.path
)?从案例 3:从本网站上的父目录导入 ,答案似乎是否定的,我需要重组我的脚本集合以避免导入上一级。
额外的问题:如果不可能,为什么不这样做的理由是什么?
python - 测试目录中的相对导入
我典型的 Python 项目结构看起来像
这很好用。
然后我注意到加法和减法测试共享相当多的代码、复杂的断言等。我试图将代码移动到帮助文件中
并从加法/减法中导入,例如
但这失败了
好吧,测试文件夹不是“包”,相对导入不起作用。 一个著名的 Python 问题。
如何在加法和减法子文件夹之间共享代码?平面目录结构不是一种选择。(在现实生活中,文件夹结构比上面的例子更复杂。)
奇怪的是,我注意到 pyscaffold对in 中的相对导入有作用tests/
,请参见此处。他们是怎么做到的?
python - 从另一个导入的文件导入文件
我有以下目录结构:
class_methods.py
导入同一目录中的其他文件,如下所示:
(obs:这些methods
文件有一个方法,里面有自己的文件名)
如果我class_methods.py
自己跑,没问题。但是,如果我尝试运行top_class.py
导入class_methods.py
,则会收到错误消息no module named method_1
因此,在执行时top_class.py
,它看不到methods_folder/
. 为什么?
python - python包的相对导入问题
首先,我已经浏览了很多关于这个问题的问答,但我找不到我的问题的解决方案。
我在 Python 3.7.9 上,我的文件结构如下所示
summary_generator.py 看起来像
使用这种方法,我可以从“生成器”目录运行 main.py:
和 summary_generator.py 与
但是,当我想从generator/summarygenerator目录运行 summary_generator.py 时,我会遇到:
ModuleNotFoundError: No module named summarygenerator
如下所示的相对导入也不能解决问题。
python - 为什么 python 会混淆我的模块包
我在根包中有一个包含 3 个嵌套包的项目
在导入和使用包时,我遇到了很多困难(通常使用 python - 可能是 Java/Eclipse 在我的选择中唯一正确的做法)。最近,我可以通过使用相对导入来滑冰,from .details import Details
比如说:从当前包/目录中的一个模块,称为 details,导入名为“Details”的类。我为程序添加了一些新的(可能是破坏性的)更改,现在,上面相同的相对导入行不再起作用。似乎解释器认为我的包是模块,所以我不能使用绝对导入。
例如,如果我将导入更改为:
我收到此错误:
我什至尝试过根据需要覆盖内置包,比如
我非常有信心我的项目打包结构设置正确(如上面的第一个示例所示(但更详细))。而且我也非常有信心我理解包、模块、相对导入和绝对导入的概念。然而,每当我尝试使用 Python 制作多包程序时,这个问题一直困扰着我。我非常感谢有人指出错误或建议我可以采取哪些措施来缓解这个持续存在的问题。
python - 机制 - 为什么使用相对导入直接在 main 上运行会导致“尝试在没有已知父包的情况下进行相对导入”
python main.py
在 main.py 有相对导入的地方运行将失败。
- 主文件
- 其他.py
PEP 338 - 将模块作为脚本执行很明显,显式相对导入在主模块中不起作用。
2.5b1 的发布显示了此 PEP 和 PEP 328 之间令人惊讶的(尽管回想起来很明显)交互 -显式相对导入在主模块中不起作用。这是因为相对导入依赖于
__name__
确定当前模块在包层次结构中的位置。在主模块中,值__name__
always'__main__'
,因此显式相对导入总是会失败(因为它们仅适用于包内的模块)。
原因
原因解释如下,解决方法是更新__path__
.
这个问题实际上并不是 -m 开关所独有的。问题是相对导入基于
__name__
,并且在主模块中,__name__
始终具有值__main__
。因此,相对导入目前无法从应用程序的主模块正常工作,因为主模块不知道它真正适合 Python 模块命名空间的位置(这对于通过-m 开关,但直接执行文件和交互式解释器完全不走运)。
通过将以下内容粘贴在模块顶部(在执行任何相对导入之前),您应该能够获得类似于旧的隐式相对导入行为的内容:这使得相对导入机制将您的主模块视为一个包。这种解决方法的问题在于,就像从主模块隐式相对导入的旧情况一样,您最终可能会在 sys.modules 中得到两个不同的兄弟模块副本。一个副本将是
__main__
.foo',而另一个将是 'package.foo'(使用隐式相对导入,第一个副本将是名为 'foo' 的顶级模块)。
相对导入和
__name__
相对导入使用模块的名称属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为' main '),那么无论模块实际位于文件系统上的哪个位置,都将相对导入解析为就好像该模块是顶级模块一样。
PEP 366 似乎启用了将 main.py 作为模块执行的解决方法。
main.py 可以通过以下方式执行:python -m <parent_directory_name>.main
.
这个 PEP 提出了一种向后兼容的机制,允许使用来自包内可执行模块的显式相对导入。由于 PEP 328 和 PEP 338 之间的尴尬交互,此类导入当前失败。
通过添加新的模块级别属性,如果使用 -m 开关执行模块,此 PEP 允许相对导入自动工作。当文件按名称执行时,模块本身的少量样板将允许相对导入工作。
提议的主要更改是引入了一个新的模块级属性package。当它存在时,相对导入将基于此属性而不是模块名称属性。
与当前名称属性一样,设置包将由用于导入模块的 PEP 302 加载器负责。使用 imp.new_module() 创建模块对象的加载器将自动将新属性设置为无。当导入系统在没有设置包(或设置为无)的模块中遇到显式相对导入时,它将计算并存储正确的值(name .rpartition('.')[0] 用于普通模块和名称用于包初始化模块)。如果已经设置了包,那么导入系统将优先使用它,而不是根据名称和路径属性重新计算包名称。
问题
阅读 1510172 和 PEP 366 后,仍然无法准确理解错误发生的机制。
我想有一个模块加载器使用__name__
它看起来代表模块层次结构。它看起来以<root>
下面的文件夹层次结构开始,以模块名称本身结束,但__main__
对于由python <script>.py
.
这些__name__
, __path__
, __package__
, 模块加载器是如何相关的,幕后到底发生了什么以及它是如何导致问题的?
python - Python 多级导入
如果相对进口,我会遇到麻烦。目录结构为:
好的,现在我有:
但我仍然得到
当我跑步时app.py
。我尝试将“..”添加到sys.path
,但最终添加到许多“..”。我试着谢谢你。我想保持脚本中的导入不变,这意味着如果两个脚本在同一个文件夹中,就不应该在from pages.df_prep import df
里面写pages_1.py
. 我愿意接受建议,但我真的不想对文件结构进行太多更改。