【问题标题】:Relative import from current file从当前文件相对导入
【发布时间】:2011-07-14 01:54:34
【问题描述】:

目前我有一个“主”文件夹,我编写的所有模块最终都存放在其中,但我通常将当前正在处理的模块放在“开发”文件夹中,这样我就不会弄乱另一个文件夹没有准备好的东西。

结构是这样的

我的程序 |-运行.py |-\库 | |-someLibrary.py | ... | |-\主要 | |-readyScripts.py | ... | |-\开发 |-inProgress.py

Run.py 将从主文件夹导入脚本。

主文件夹中的脚本使用相对导入从 lib 文件夹中导入 someLibrary,它工作正常。

但是,当我仍在 dev 文件夹中编写程序并直接从那里运行它时它不起作用(即:python inProgress.py),说我“尝试在非包中进行相对导入”

当我在 dev 中处理脚本时,有没有办法能够从 lib 文件夹中导入模块?

编辑:这是我在 inProgress.py 中的导入语句:

从 .lib 导入 someLibrary

理想情况下,我想保持这种方式,这样当我将它移到主文件夹时,我就不必对 import 语句做任何事情了。

【问题讨论】:

    标签: python import


    【解决方案1】:

    如果您将 PYTHONPATH 设置为 MyProg,您可以在每个文件夹中创建一个空的 __init__.py 文件,以便 python 将它们识别为模块:

    MyProg
    |-run.py
    |-__init__.py
    |-\lib
    | |-someLibrary.py
    | |-__init__.py
    | ...
    |
    |-\main
    | |-readyScripts.py
    | |-__init__.py
    | ...
    |
    |-\dev
    | |-inProgress.py
    | |-__init__.py
    

    所以在你的 inProgress.py 文件中,你可以使用:

    import lib.someLibrary
    

    在你的 run.py 中你可以这样做:

    import main.readyScripts
    import dev.inProgress
    

    【讨论】:

      【解决方案2】:

      一种选择是使用它们的路径导入:

      import imp
      
      foo = imp.load_source('module.name', '/path/to/file.py')
      foo.MyClass()
      

      【讨论】:

        【解决方案3】:

        将您的PYTHONPATH 设置为上一级,然后使用包语法运行它?

        【讨论】:

        • 我不确定“使用包语法运行它”是什么意思。
        猜你喜欢
        • 2020-10-27
        • 2020-11-03
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 2013-07-12
        • 2013-10-20
        • 2012-12-13
        相关资源
        最近更新 更多