2016-06-11 79 views
1

我是一名计算机科学专业的第一年级学生,目前正在从事一个小型项目,并将其保存到学校的保管箱中。如何在python包的开发过程中正确导入?

对于一个潜在的微不足道的问题,我提前道歉。但几乎没有经验,并尝试所有我已经教过的调试技术后,我真的陷入了困境!

它具有以下文件结构

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将做出相应的调整?还是他们是分开的实体,这个过程有点牵扯?我查看了其他线程,但他们似乎都在运行时修改了Python脚本本身的PYTHONPATH,我认为这是未来错误的巨大潜在来源。

回答

1

这是你应该做的方式:

from ..helper_functions import utility 

如果正常运行的Python程序这将无法正常工作,由于相对进口。

这是你应该运行的方式:

python3 -m helper_functions.utility 

但它有点冗长,不喜欢#一个shebang行拌匀的/ usr/bin中/ env的python3!

虽然它不是唯一的。你的包装结构更复杂。您需要在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 
+0

感谢您的回复。错误没有消失。同样的语法错误,但现在指向'helper_functions'和'utility'之间'''的时间段 – AlanSTACK

+1

似乎我们正在取得进展:) –

+0

试试这个:'from ..helper_functions import utility' –

0

绝对进口量推荐佩普8:

Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path):

对于PYTHONPATH,每个地方你的项目可能是最适合现在的工作终端会话设置一次。一旦你继续使用像pycharm这样的IDE,这将自动为你管理

+1

相对进口不再那么灰心,看到这个答案:https://stackoverflow.com/questions/4209641#answer-16748366 – Pawamoy

+1

这个措辞不包括在[当前版本的pep8](https://www.python .ORG的/ dev/PEPS/PEP-0008 /)。相反,它表示:建议使用_Absolute导入,因为它们通常更具可读性,并且如果导入系统配置不正确(例如,当包内的目录结束时,它往往会表现得更好(或至少提供更好的错误消息) sys.path):_ –

+0

更新,谢谢。 – renemilk