Python3-如何正确执行绝对导入并使Pylint满意

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随时不修改。
  • 让pylint开心。
  • 使用正确的Python3导入。

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.pyImportError: No module named 'my_project'

然后,我可以运行它的唯一方法是从父目录作为模块:python3 -m my_project.main

所以我的问题是:是否有可能以正确的方式进行导入,同时仍然能够像这样执行导入python3 main.py

非常感谢!

Aro*_*unt 1

我会做类似的事情:

/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

皮林特似乎对此很高兴。