use*_*113 5 python pylint python-import python-3.x python-3.5
我在理解Python 3导入时遇到了很大的麻烦(我正在使用Python 3.5)。这似乎是一个百万美元的问题,我知道到处都有答案。但是,我并没有真正了解应该如何做。互联网上的答案差异很大。所以提前对不起,如果这是一个几乎重复的答案。我真的很感激良好的阅读材料的引用。
所以我有以下虚拟项目:
/my_project/main.py
/my_project/lib/__init__.py
/my project/lib/my_lib.py
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想:
python3 main.py,有my_project作为当前工作目录。PYTHONPATH随时不修改。main.py 包含:
from .lib.my_lib import foo
if __name__ == '__main__':
foo()
Run Code Online (Sandbox Code Playgroud)
并foo据此定义lib/my_lib.py
使用该配置,我得到:
SystemError: Parent module '' not loaded, cannot perform relative import
我可以通过导入像避开错误:
from lib.my_lib import foo
Run Code Online (Sandbox Code Playgroud)
但是然后1)这不是Python3绝对导入,对吗?2)Pylint抱怨:Unable to import 'lib.my_lib' (import-error)
我尝试的下一件事情是添加一个my_project/__init__.py,然后像这样导入:
from my_project.lib.my_lib import foo
Run Code Online (Sandbox Code Playgroud)
在这种情况下,pylint很高兴,但是我不能这样运行python3 main.py:
ImportError: No module named 'my_project'
然后,我可以运行它的唯一方法是从父目录作为模块:python3 -m my_project.main。
所以我的问题是:是否有可能以正确的方式进行导入,同时仍然能够像这样执行导入python3 main.py?
非常感谢!
我会做类似的事情:
/path/README
/path/requirements.txt
/path/cleverappname/__main__.py
/path/cleverappname/__init__.py
/path/cleverappname/foo.py
/path/cleverappname/bar.py
Run Code Online (Sandbox Code Playgroud)
假设你有类似class CleverName(object)in 的东西__init__.py和类似class Foo(object)in 的东西foo.py(酒吧也一样,你明白了)。
在__main__:
from cleverappname import CleverName
from cleverappname.foo import Foo
from cleverappname.bar import Bar
Run Code Online (Sandbox Code Playgroud)
但是,它需要你将它用作 python 而不是脚本(这是正确的,因为它就是这样):python3 -m clevername
皮林特似乎对此很高兴。