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

2024-05-07

这是我的包层次结构

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 inside app1.py。 所以我给了import app.global_vars.py在 app1.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(). The app目录本身被添加(不是作为包,而是作为导入搜索路径)。

您有 4 个选择:

  1. Move server.py out of the app包(旁边)
  2. 旁边添加一个新的脚本文件app只运行:

    from app import server
    server.main()
    
  3. Use the -m开关选项 https://docs.python.org/3/using/cmdline.html#cmdoption-m运行一个module作为主要入口点:

    python -m app.server
    
  4. 添加父目录server.py to sys.path:

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

    然而,最后一个选项可能会带来更多问题;现在两个app包和包含的模块in the app套餐已开启sys.path。您可以同时导入app.server and serverPython 会将它们视为两个独立的模块,每个模块都有自己的条目sys.modules,具有其全局变量的单独副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python从更高级别的包导入模块 的相关文章

随机推荐