【问题标题】:How to properly do importing during development of a python package? [duplicate]python包开发过程中如何正确导入? [复制]
【发布时间】:2016-06-11 09:32:01
【问题描述】:

我是计算机科学专业的一年级学生,目前正在从事一个小项目,我将其保存到学校的 Dropbox。

对于一个可能微不足道的问题,我提前道歉。但是几乎没有经验,并且在尝试了我所教的所有调试技术之后,我真的卡住了!

文件结构如下

school_project/
     __init__.py       #(empty)
     main_functions/
         __init__.py   #(empty)
         render.py
         filter.py
     helper_functions/
         __init__.py   #(empty)
         string.py
         utility.py

目前,我需要在文件render.py 中使用utility.py 中创建的函数。我第一次尝试解决这个问题是在文件render.py 中做import ..helper_functions.utility

不幸的是,它遇到了以下错误消息。

import ..helper_functions.utility
       ^
SyntaxError: invalid syntax

首先,我不知道为什么这种相对导入不起作用。

其次,我应该只使用绝对导入吗?形式为import school_project.helper_functions.utility?如果是这样,我是否需要将school_project/ 当前所在的目录添加到 PYTHONPATH?我该怎么做?

我是否只需修改我计算机的 PATH 并且 PYTHONPATH 会相应地进行调整吗?还是它们是独立的实体,并且过程涉及更多?我查看了其他线程,但它们似乎都在运行时在 python 脚本本身中修改了 PYTHONPATH,我认为这是未来错误的巨大潜在来源。

【问题讨论】:

    标签: python python-3.x import package


    【解决方案1】:

    你应该这样做:

      from ..helper_functions import utility
    

    如果由于相对导入而正常运行 python 程序,这将不起作用。

    这是你应该运行它的方式:

    python3 -m helper_functions.utility
    

    但它有点冗长,并且不能很好地与 #!/usr/bin/env python3 之类的 shebang 行混合。

    虽然它不是唯一的。您的包结构更复杂。您需要在 PYTHONPATH 中包含包含您的包目录的目录,然后这样做。

    从 mypackage.mymodule 导入 as_int

    您也可以这样做。但这不建议初学者使用。 您只需使用此代码首先在代码中使用 PYTHONPATH...

    import sys
    import os
    
    PACKAGE_PARENT = '..'
    SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))))
    sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT)))
    
    from mypackage.mymodule import as_int
    

    【讨论】:

    • 感谢您的回复。错误并没有消失。相同的语法错误,但它现在指向 helper_functionsutility 之间的句点 .
    • 看来我们正在取得进展:)
    • 试试这个:from ..helper_functions import utility
    • SystemError: Parent module '' not loaded, cannot perform relative import
    • 我接受这个答案之前的最后一个问题。我该怎么办You'll need to include the directory containing your package directory in PYTHONPATH
    【解决方案2】:

    Pep 8 建议使用绝对导入:

    建议使用绝对导入,因为如果导入系统配置不正确(例如包内的目录最终位于 sys.路径):

    至于PYTHONPATH,在您处理项目的每个终端会话中设置一次可能是目前最好的。一旦您继续使用像 pycharm 这样的 IDE,它将自动为您管理

    【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2016-10-23
    • 2016-10-29
    • 1970-01-01
    • 2017-02-23
    • 2021-09-22
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多