2017-12-22 21 views
3

Python 3のインポート(私はPython 3.5を使用しています)を理解しようとすると巨大な問題を抱えています。これは百万ドルの質問と思われ、私はそれがどこでも答えられていることを知っています。しかし、私は本当に物事がどのように行われるべきかをよく理解することはできません。インターネット上の回答は大きく異なります。これは、ほぼ重複した回答であれば、事前に申し訳ありません。私は本当に良い読書資料への言及に感謝します。Python3 - 絶対インポートを正しく行い、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: Parent module '' not loaded, cannot perform relative import

私がすることでエラーを回避することができます次のようなインポート:

from lib.my_lib import foo 

しかし、1)これはPython3の絶対インポートではありません。私が試した次の事がmy_project/__init__.pyを追加することであり、このような輸入Unable to import 'lib.my_lib' (import-error)

を::2)Pylintは文句を言い

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として実行できるのでしょうか?

ありがとうございます!

+0

'from lib.my_lib import foo' * is is absolute import:現在の作業ディレクトリは自動的に' sys.path'にあり、最初のディレクトリでもあります。 – Evert

+0

もっと正確にするためには、 'sys.path'の最初のエントリは[" "Pythonインタープリタを呼び出すのに使われたスクリプトを含むディレクトリです"](https://docs.python.org/3 /library/sys.html#sys.path)。 – Evert

+0

pylintで問題を再現できません:インポートエラーは発生しません。 – Evert

答えて

0

私のようなものだろう:(同じバーのために、あなたがアイデアを得た)foo.pyにあなたが__init__.pyclass CleverName(object)のようなものを持っていると仮定すると

/path/README 
/path/requirements.txt 
/path/cleverappname/__main__.py 
/path/cleverappname/__init__.py 
/path/cleverappname/foo.py 
/path/cleverappname/bar.py 

class Foo(object)のようなものを。__main__

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

しかし、それはPythonのではなく(それはそれが何であるかだから、右である)スクリプトとしてそれを使用するためにあなたを必要とします:python3 -m clevername

Pylint約幸せに思えますそれ。

+0

イントラパッケージのインポートには相対インポートを使用します。パッケージの名前を変更する(またはインストールする人は名前を変更する)ことを念頭に置いてください。 – Evert

関連する問題