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

Python从更高级别的包中导入模块

夏经武
2023-03-14
问题内容

这是我的包裹层次结构

app  
|--__init__.py    //Empty file
|--server.py  
|--global_vars.py  
|
|--handlers    
   |--__init__.py    //Empty file
   |
   |--url1
   |  |--__init__.py    //Empty file
   |  |--app1.py
   |  |--app2.py
   |
   |--url2
      |--__init__.py    //Empty file
      |--app3.py

现在我要导入global_vars.py里面app1.py。所以我给了 import app.global_vars.pyapp1.py。

但是我收到以下错误:

    import app.global_vars
ImportError: No module named app.global_vars

我还应该提到我是从server.py导入app1.py的。server.py是我实际上正在运行的文件。当server.py导入app1.py时,app1.py尝试导入时global_vars.py出现上述错误

我在这里做错了什么?


问题答案:

如果您app/server.py以脚本运行,app则不会将的父目录添加到中sys.path()。该app目录本身,而不是被添加(而不是作为一个包,但作为进口搜索路径)。

您有4个选择:

  1. 移动server.py 所述的app包(它旁边)
  2. app在仅运行的旁边添加一个新的脚本文件:

    from app import server
    

    server.main()

  3. 使用-mswitch选项将 模块 作为主要入口点运行:

    python -m app.server
    
  4. 将的父目录添加server.pysys.path

    import os.path
    

    import sys

    parent = os.path.dirname(os.path.dirname(os.path.abspath(file)))
    sys.path.insert(0, parent)

但是,这最后一个选项可能会带来更多问题。现在两个app包和包含在模块
app封装上sys.path。您可以同时导入app.serverserver,Python将把它们视为两个独立的模块,每个模块在中都有自己的条目sys.modules,并具有各自的全局变量的单独副本。



 类似资料:
  • 假设您的代码正在使用一个模块,该模块使用来自该模块的的日志语句,而不是来自记录器实例的,并且您没有控制权来修改该模块正在使用中。 是否可以在不要求维护者修改代码的情况下为导入的模块自定义日志级别? 这些问题描述了一种非常简单的方法来更改特定模块的日志记录级别 如何禁用来自请求库的日志消息 Python日志记录-禁用导入模块的日志记录 下面的代码实现了所述的解决方案,只记录来自该模块的错误消息,但它

  • 问题内容: 我不清楚如何正确命名这个问题。 情况1 假设我具有以下目录结构。 如果我有 我如何知道要导入哪个条(或)?有没有简单的方法可以自动检测到这种情况? 情况二 如果other.py有这一行 我如何知道要导入哪个foo(foo或foo.foo)?再次,这是否是一种简单的方法来自动检测到这种情况? 问题答案: TLDR;如果程序包位于同一目录中,则它们优先于相同名称的模块。 从文档: “当导入

  • 问题内容: 哪种风格更好? 风格A: 风格B: 假设 在代码的其他地方没有使用,仅在此函数内部使用。 问题答案: 确实,如前所述,通常最好遵循PEP 8的建议,并在顶部进行导入。虽然有一些例外。理解它们的关键在于您在第二段中嵌入的问题:“导入在哪个阶段发生?” 导入实际上是一个可执行语句。导入模块时,模块中的所有可执行语句都会运行。“ def”也是可执行的语句;它的执行将使定义的名称与(已编译的)

  • 问题内容: 我有一个Python脚本,该脚本从磁盘加载3-D图像堆栈,对其进行平滑处理,然后将其显示为电影。当我想快速查看数据时,我从系统命令提示符下调用此脚本。我认为平滑数据需要700毫秒,因为这与MATLAB相当。但是,导入模块需要花费额外的650毫秒。因此,从用户的角度来看,Python代码以一半的速度运行。 这是我要导入的一系列模块: 当然,并非所有模块的导入速度都一样慢。罪魁祸首是: 我

  • 问题内容: 我想了解如何从导入的模块执行功能。 这是我到目前为止的位置。 app / mocking.py: app / my_module / init.py: 测试/模拟测试.py: 这不 符合 我的预期。“已修补”模块仅返回的未模拟值。如何模拟要导入到被测名称空间中的其他包中的方法? 问题答案: 当您从包中使用装饰器时,您 未在 修补名称空间(从本例中导入模块),而是在被测试的名称空间中对其

  • 问题内容: 我的内存中有一些Python文件,可能是StringIO。如何导入存储在内存中的模块文件?我不想将其保存到磁盘然后加载。 看起来像: 问题答案: 一种不错的方法是使用PEP 302中所述的自定义元导入挂钩。可以编写一个从字符串字典动态导入模块的类: 顺便说一句:如果您不想太多,而只想导入一个字符串,那么请坚持执行load_module方法。您只需要在里面。