我是一名计算机科学专业的第一年学生,目前正致力于一个小项目,我将其保存到学校的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的巨大潜在根源。
答案 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之后,这将自动为您管理