我在尝试理解Python 3的导入(我正在使用Python 3.5),但是遇到了很大的困难。这似乎是一个价值百万美元的问题,我知道它已经得到了各处的回答。但是我并没有真正理解应该如何完成;互联网上的答案差异很大。如果这几乎是重复的答案,那么我提前表示歉意。我非常感谢好的阅读材料的参考。
所以我有以下虚拟项目:
如果可能的话,我想要做到以下几点:
在这种情况下,Pylint很开心,但我不能像这样运行:
那么我的问题是:是否有可能以正确的方式进行导入,同时仍然能够像这样执行:
非常感谢!
所以我有以下虚拟项目:
/my_project/main.py
/my_project/lib/__init__.py
/my project/lib/my_lib.py
如果可能的话,我想要做到以下几点:
- 能够在当前工作目录下以
python3 main.py
的方式运行我的程序,其中my_project
是当前工作目录。 - 不修改任何时候的
PYTHONPATH
。 - 让pylint满意。
- 使用正确的Python3导入。
main.py
包含:
from .lib.my_lib import foo
if __name__ == '__main__':
foo()
而foo
则是在lib/my_lib.py
文件中定义的。
有了这个配置,我得到了以下错误:
SystemError: 父模块“”未加载,无法执行相对导入
我可以通过以下方式解决这个错误:
from lib.my_lib import foo
但是这不是 Python3 的绝对导入,对吧?而且 2)Pylint 报错:无法导入 'lib.my_lib' (import-error)
接下来我尝试添加 my_project/__init__.py
文件,并像下面这样导入:
from my_project.lib.my_lib import foo
在这种情况下,Pylint很开心,但我不能像这样运行:
python3 main.py
:ImportError: No module named 'my_project'
那么我唯一能运行它的方式是从父目录作为模块运行:python3 -m my_project.main
。那么我的问题是:是否有可能以正确的方式进行导入,同时仍然能够像这样执行:
python3 main.py
?非常感谢!
from lib.my_lib import foo
是 绝对导入:当前工作目录自动成为sys.path
中的第一个目录。 - user707650sys.path
中的第一个条目是 "包含用于调用 Python 解释器的脚本的目录"。 - user707650my_project2
与my_project
处于同一级别。它会不会搞乱路径,导致我在导入时出现错误?我不确定是否应该像这样运行pylint,还是逐个文件循环运行。 - user1011113