如何在python包的开发过程中正确导入?[duplicate]

frebpwbc  于 2023-02-06  发布在  Python
关注(0)|答案(2)|浏览(147)
    • 此问题在此处已有答案**:

Python relative import causes SyntaxError exception(2个答案)
六年前关闭了。
我现在使用的代码的文件结构如下所示:

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中?我该怎么做?
我只是修改了我的计算机的PATHPYTHONPATH就会相应地进行调整吗?或者它们是独立的实体,进程会更复杂一些?我看过其他线程,但它们似乎都在运行时修改了PYTHONPATH,我认为这是未来错误的一个巨大潜在来源。

ozxc1zmp

ozxc1zmp1#

你应该这样做:

from ..helper_functions import utility

如果由于相对导入而正常运行python程序,这将不起作用。
这是您应该运行它的方式:

python3 -m helper_functions.utility

但是它有点冗长,而且不能很好地与#!/usr/bin/env python3这样的shebang行混合。
虽然它不是唯一的。你的包结构比较复杂。你需要把包含你的包目录的目录包含在PYTHONPATH中,并像这样做。
从mypackage.mymodule导入为_int
你也可以这样做。但是这不是推荐给初学者的。你只需要先用这个在代码中frob 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
apeeds0o

apeeds0o2#

在第8章中建议绝对导入:
推荐使用绝对导入,因为如果导入系统配置不正确(例如,当一个包内的一个目录在sys.path上结束时),它们通常更可读,表现更好(或者至少给予更好的错误消息):
至于PYTHONPATH,现在最好在每个终端会话中设置一次,一旦您继续使用pycharm这样的IDE,它将自动为您管理

相关问题