【问题标题】:Portable way to import modules from parent directory in Python在 Python 中从父目录导入模块的便携方法
【发布时间】:2021-04-14 23:10:02
【问题描述】:

我知道这是一个陈旧的话题,但 python 中的导入机制仍然让大众感到困惑。我想要的是能够以一种允许我将项目带到另一个环境并让所有导入工作的方式导入位于父目录中的自定义模块的能力。 例如这样的结构:

repo 
  |--- folder1
  |       |--- script1.py
  |--- folder2       
  |       |--- script2.py 
  |--- utils
          |--- some-util.py

如何从some-util.py 导入script1script2?这个想法是我可以将 repo 克隆到远程主机并从文件夹 1 和 2 运行脚本,这些脚本可能具有some-util.py 的共享依赖项,只是我不想事先运行任何东西。我希望能够:

连接到盒子

git clone repo
python repo/folder1/script1.py

script1 和 script2 的内容:

import some-util

<code>

编辑: 我忘了提到有时脚本需要从另一个目录运行,例如: /nas/some_folder/repo/folder1/script1.py args..

此外,该框仅限于 python 2.7.5

【问题讨论】:

    标签: python python-import


    【解决方案1】:

    诀窍是将脚本实现为模块(阅读herehere 以了解python -m 开关的含义)。

    这是一个结构,还要注意每个目录都包含一个名为__init__.py的(空文件):

    repo/
    |____utils/
    | |____someutil.py
    | |___ __init__.py
    |___ __init__.py
    |____folder1/
      |____script1.py
      |___ __init__.py
    

    utils.someutil 可能包含如下内容:

    def say_hello():
        return "Hello World."
    

    而您的script1.py 可能包含以下内容:

    from ..utils.someutil import say_hello
    
    if __name__ == "__main__":
        print(say_hello())
    

    然后运行以下命令:

    python -m repo.folder1.script1
    

    ...产生:

    Hello World.
    

    【讨论】:

    • 您的答案与您发布的完全一样。感谢展示如何做到这一点,但是我忘了提到(见编辑)我需要能够从 linux 服务器上的任何地方运行脚本。仅当您的级别高于根(repo)目录时,您的答案才有效。否则你会得到:No module named &lt;some parent directory&gt;.repo.folder1
    • 我认为使用克隆存储库的相同工具在sh/bash 中处理编辑会更好。例如:cd /nas/git_directories/; python2 -m repo.folder1.script1,或者如果您将其嵌入到其他脚本中,则使用子 shell。
    • 您能否添加有关问题约束的更多详细信息?每种情况都有一些极端情况(例如,这有时是一个有效的调用,但您通常希望避免这种情况:python2 ../nas/./../repo/folder1/script.py
    • 例如:args 是否包含一个文件的位置,该位置会根据调用它的目录而有所不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    相关资源
    最近更新 更多