Python3 - 如何正确地进行绝对导入并使Pylint感到高兴

时间:2017-12-22 10:02:26

标签: python python-3.x python-3.5 python-import pylint

我在尝试理解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
  • 让pylint高兴。
  • 使用正确的Python3导入。

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

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

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

非常感谢!

1 个答案:

答案 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__.pyclass Foo(object)中有foo.py之类的内容(条形码相同,您就明白了)。

__main__

from cleverappname import CleverName
from cleverappname.foo import Foo
from cleverappname.bar import Bar

但是,它需要你将它用作python而不是脚本(这是正确的,因为它是什么):python3 -m clevername

Pylint对此感到高兴。