如何在开发python包期间正确导入?

时间:2016-06-11 09:32:01

标签: python python-3.x import package

我是一名计算机科学专业的第一年学生,目前正致力于一个小项目,我将其保存到学校的Dropbox。

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

它具有以下文件结构

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

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

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

import ..helper_functions.utility
       ^
SyntaxError: invalid syntax

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

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

我只是修改我的电脑的 PATH PYTHONPATH 会相应调整吗?或者它们是独立的实体,而且过程涉及更多一点?我看过其他线程,但他们似乎都在python脚本本身的运行时修改 PYTHONPATH ,我认为这是未来bug的巨大潜在根源。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Pep 8推荐绝对进口:

  

建议使用绝对导入,因为如果导入系统配置不正确(例如,包中的目录最终在sys上),它们通常更具可读性,并且往往表现更好(或至少提供更好的错误消息)。路径):

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