当前位置: 首页 > 面试题库 >

从上一级目录(包)导入模块

邢华清
2023-03-14
问题内容

在Python中从上一级目录导入模块的正确方法是什么?该目录是包含所有这些模块的Python软件包,而我有一个子目录,其中包含需要这些模块的代码。

以下工作正常,但这只是一个hack。我想要一种推荐的/ pythonic方式。

import sys
sys.path.append("../")
from fruit import Fruit
print("OK")

目录结构:

pkg1
   __init__.py  
   fruit.py  
   +sub_pkg
      __init__.py
      recipe.py

fruit.py的内容

class Fruit:
   def get_name(self):
       print("Fruit name")

sub_pkg/recipe.py..的内容只是一个导入行:

from fruit import Fruit

当我跑步时:

python recipe.py

它给出以下错误。

Traceback (most recent call last):
  File "recipe.py", line 2, in <module>
    from fruit import Fruit
ImportError: No module named fruit

我也尝试过:from pkg1.fruit import Fruit,不起作用。还看着其他类似的问题.. python -m recipe.py
还是python -m sub_pkg/recipe.py没有用。


问题答案:

在您的主文件中,recipe.py添加pkg1路径到PYTHONPATH

sys.path.append('/path/to/pkg1')

或使用相对路径

sys.path.append('../..')

这应该允许pkg1从程序中的任何位置导入。

总是有使用此处建议的相对导入的选项,我发现使用绝对导入更具可读性,并且不太可能导致错误。同样,在使用相对导入的大型项目中,您将不断地计算路径层次结构,而在使用绝对导入时,很容易知道您始终引用一个根目录。

关于从Python
2.5中的PEP328的相对导入:

读取依赖于相对导入的代码也不太清楚,因为可能会使读者对打算使用哪个模块感到困惑。Python用户很快就学会了不要在其包的子模块名称中重复使用标准库模块的名称,但是您无法避免在将来的Python版本中将子模块的名称用于新模块中。

Guido建议在相对导入中使用前导点,以避免如上所述从PEP328再次出现含糊的导入:

Guido已宣布相对进口将使用前导点。单个前导点表示从当前包开始的相对导入。两个或多个前导点将相对导入当前程序包的父级,第一个点后每个点一个级别。



 类似资料:
  • 问题内容: 我有一个名为“ ClassA”的Python类,另一个应该导入“ A ClassB”的ClassA的Python类。目录结构如下: 我将如何使用,以便ClassB可以使用ClassA? 问题答案: 您确实应该使用软件包。然后将MainDir放置在文件系统中sys.path上的某个点(例如… / site- packages)上,然后可以在ClassB中说: 您只需要在每个目录中放置命名

  • 本文向大家介绍python import 上级目录的导入,包括了python import 上级目录的导入的使用技巧和注意事项,需要的朋友参考一下 有时候我们可能需要import另一个路径下的python文件,例如下面这个目录结构,我们想要在_train.py里import在networks目录下的_lstm.py和上级目录下的_config.py。 只需两步操作 (1)在networks文件夹下

  • 当尝试编译名为UserO的原始文件时ptions.proto它有一个名为A的导入ccount.proto使用下面的命令 我得到以下错误: PS:用户选项。proto位于目录/home/project\u new1/settings中导入帐户。proto存在于目录/home/project\u new1/account中 原型描述符文件: 用户选项。原型 账户原型

  • 问题内容: 这是我的包裹层次结构 现在我要导入里面。所以我给了 app1.py。 但是我收到以下错误: 我还应该提到我是从server.py导入app1.py的。是我实际上正在运行的文件。当server.py导入app1.py时,尝试导入时出现上述错误 我在这里做错了什么? 问题答案: 如果您以脚本运行,则不会将的父目录添加到中。该目录本身,而不是被添加(而不是作为一个包,但作为进口搜索路径)。

  • 这是我的Android项目 我想将自定义包从目录应用程序导入目录示例。伙计们,怎么做???

  • 问题内容: 我有以下内容: 我正在尝试从父目录导入。在这种情况下,我尝试从测试文件夹中运行“ UnitTest1.py”,并从其上方的目录(文件“ ModuleFile.py”)导入。 我知道已经有很多答案。 SO问题1,SO问题2,其他所有SO问题。我只是找不到“使用../”作为相对导入而不是显式路径。 我知道从Python 2.5开始,根据提到使用的文档,它们支持“相对导入”,但是我专门尝试这

  • 问题内容: 我有一个使用内置模块的Python脚本,但也导入了与主脚本本身位于同一目录中的许多自定义模块。 例如,我会打电话 和agent.py具有许多导入,包括: 其中checks与agent.py位于同一目录中的文件 当前工作目录为agent /时,一切都很好。但是,如果我从任何其他目录调用agent.py,则显然无法导入checks.py等错误。 我如何确保可以导入自定义模块,而不管从哪里调

  • 本文向大家介绍meteor 导入/模块目录结构,包括了meteor 导入/模块目录结构的使用技巧和注意事项,需要的朋友参考一下 示例 流星的最新版本支持ecmascriptES6或ES2015。Javascript现在支持import语句和模块,而不是软件包,从而取代了仅用于软件包的应用程序。最新的目录结构类似于仅打包的结构,但是使用/imports目录代替/packages。