我在尝试理解Python 3导入时遇到了很大麻烦(我正在使用Python 3.5)。这似乎是一个百万美元的问题,我知道它已在各地得到解答。但是我无法真正理解事情应该如何完成;互联网上的答案差异很大。如果这是一个几乎重复的答案,请提前抱歉。我非常感谢参考好的阅读材料。
所以我有以下虚拟项目:
/my_project/main.py
/my_project/lib/__init__.py
/my project/lib/my_lib.py
如果可能,我想:
python3 main.py
的身份运行我的程序,将my_project
作为当前工作目录。PYTHONPATH
。 main.py
包含:
from .lib.my_lib import foo
if __name__ == '__main__':
foo()
foo
lib/my_lib.py
使用该配置,我得到:
SystemError: Parent module '' not loaded, cannot perform relative import
我可以通过导入如下来解决错误:
from lib.my_lib import foo
但是1)这不是Python3的绝对导入,对吧? 2)Pylint抱怨:Unable to import '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
执行?
非常感谢!
答案 0 :(得分:0)
我会做类似的事情:
/path/README
/path/requirements.txt
/path/cleverappname/__main__.py
/path/cleverappname/__init__.py
/path/cleverappname/foo.py
/path/cleverappname/bar.py
假设class CleverName(object)
中有__init__.py
,class Foo(object)
中有foo.py
之类的内容(条形码相同,您就明白了)。
在__main__
:
from cleverappname import CleverName
from cleverappname.foo import Foo
from cleverappname.bar import Bar
但是,它需要你将它用作python而不是脚本(这是正确的,因为它是什么):python3 -m clevername
Pylint对此感到高兴。