web-dev-qa-db-ja.com

fromを使用したImportError。単純なpythonファイルにxをインポートする

python 2 to python 3からいくつかのコードを移植したかったので、インポートエラーで失敗しました。そのため、移植自体を取り除いてフォーカスしようとしましたインポート時に2つの基本的なpythonでテストするファイルを作成します。ただし、それらを機能させることさえできません。

だから私は2つのファイルを持っています

test.py:

print('Test works')

そしてtest2.py:

from . import test

ただし、結果はPycharmで次のエラーになります。

ImportError:「__main__」から名前「test」をインポートできません(C:/Users/Username/test2.py)

Ubuntu Shellの場合:

トレースバック(最新の呼び出しは最後):ファイル「test2.py」、1行目、 import test1 SystemError:親モジュール ''がロードされていないため、相対インポートを実行できません

どうすれば解決できますか?

6
JordyRitzen

この「フォルダー構造が重要」はpython3の大きな問題です。フォルダー構造はコーディングの際には重要ではありませんが、適切に参照する必要があります。

ローカルで実行するか、モジュールの一部として実行するかに応じて、if/elseを使用することに頼りました:

if __name__ == "__main__": # Local Run
    import test
else: # Module Run, When going production - delete if/else
    from . import test
2
John Freeman

フォルダー構造が重要です。モジュールに名前を付けていません。 fooと呼びます。物事を正しい場所に置く:

$ mkdir foo
$ touch foo/__init__.py
$ mv /some/place/{test1,test2}.py foo/

Test.pyファイルを作成する前でも、python -c 'import test'はすでに機能していることに注意してください。混乱を避けるために、ファイルにtest1.pyという名前を付けることをお勧めします。

コードを呼び出す方法は重要です。 .ドットがsys.pathにあることを確認します。

$ export PYTHONPATH=.
$ python -m foo.test1

または、必要に応じてこれが機能するはずです。

$ python foo/test1.py

編集:

私は質問#1に答え、OPはこの診断について質問#2を尋ねます。

ImportError:「main」から名前「test」をインポートできません(C:/Users/Username/test2.py)

ファイルを適切な構造で整理してください。 test2.pyをfoo/ディレクトリ(またはそれを呼び出したいもの)に配置する必要があります。空のfoo/__init__.pyファイルを作成する必要があります。これは、import機構にとって重要であるためです。

また、呼び出し環境のPYTHONPATH env varも重要です。コマンドライン環境に加えて、PyCharm環境が導入されました。プロジェクトに合わせてPyCharmを正しく構成するように注意してください。 [設定]-> [プロジェクト構造]をクリックし、fooがソースフォルダとして表示されることを確認します。次の行を実行すると、どちらの環境でもこれをデバッグできます。

import sys
import pprint
pprint.pprint(sys.path)

プロジェクトが整っていなくてもimport testは成功するので、test1.pyに名前を変更してimport test1を使用することをお勧めします。これにより、確実に確実にyourコード。

1
J_H

Python3では

test2.py:

import test

test.py:

if __name__ == "__main__":
    print('Test works')

「テスト作品」を他のファイルに印刷する場合 test2.py:

import test
test.main()

test.py:

def main():
    print('Test works')

if __name__ == "__main__":
    main()
1
Santhosh Kumar

同じ問題があり、2to3変換スクリプトから追加された「from。」を削除してしまいました。

0
Lee