web-dev-qa-db-ja.com

PyCharmプロジェクトフォルダrecsでのModuleNotFoundErrorエラー

私はPyCharmでプロジェクトに取り組んでいます。プロジェクトの構造は次のとおりです。

/projectRoot/
   folder1/
       somecode.py
   utils/
       __init__.py
       myutils1.py

PyCharmコンソールでコードをインタラクティブに実行するとき、およびを使用してコードを実行するときにインポートが機能するように、インポートを実行する方法を知りたい

python somecode.py 

ターミナルのコマンド。

現在私は:

from utils.myutils1.py import myClass

しかし、コマンドラインではエラーが発生します:

ファイル「somecode.py」、行10、utils.myutils1からインポートmyClass ModuleNotFoundError: 'utils'という名前のモジュールはありません

そしてPyCharmで:

トレースバック(最後の最後の呼び出し):ファイル「/home/ubuntu/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py」、行2881、run_code exec(code_obj、self.user_global_ns、self .user_ns)ファイル ""、1行目、utils.myutils1からimport myClass ModuleNotFoundError: 'utils'という名前のモジュールはありません

プロジェクト内のモジュールの適切なフォルダー構造に関する推奨事項、およびそれらを適切にインポートする方法

ありがとう!

12
Dnaiel

答えを説明するために、私はあなたが持っていたプロジェクト構造を再作成しました

_/projectRoot/
   folder1/
       somecode.py
   utils/
       __init__.py
       myutils1.py
_

somecode.py

_from utils.myutils1 import myclass

if __name__ == "__main__":
   print(myclass)
_

myutils1.py

_myclass="tarun"
_

Pycharmから実行すると問題なく動作しますが、ターミナルから実行すると以下のエラーが発生します

_  File "somecode.py", line XX, in <module>
    from utils.myutils1 import myclass
ModuleNotFoundError: No module named 'utils'
_

問題は、Pycharmがあなたのためにほとんど何もしないということです。なぜなら、あなたはそれがターミナルで動作していない理由を理解していないからです。そのため、あなたが何をする必要があるかを話す前に、PyCharmが単独で行う2つのことを説明します。

Pythonコンソール

PycharmからPython Consoleを起動すると、設定を使用して実行されるコードがいくつかあります。

Python Console

ご覧のとおり、2つのオプションがあります

_[X] Add content roots to PYTHONPATH
[ ] Add source roots to PYTHONPATH
_

そして、開始スクリプトも同様です。そのため、プロジェクトのルートがpythonのパスに追加されます。環境変数_sys.path_およびPYTHONPATHの2つの主な方法で制御されます

Python Consoleで以下のコードを実行すると

_>>> import sys
>>> sys.path
['/Applications/PyCharm.app/Contents/helpers/pydev', 
'/Applications/PyCharm.app/Contents/helpers/pydev', 
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python27.Zip', 
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7', ....
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7/site-packages', 
'/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27']
_

ご覧のとおり、_'/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27'_がPythonターミナルに追加されています。

Pythonの構成

Pycharmを使用してコードで実行するように構成する場合、同様の2つのオプションがあります。

Run configurations

_somecode.py_のコードを以下に変更できます

_import os
print (os.environ['PYTHONPATH'])

import sys
print (sys.path)

/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27
['/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27/folder1', 
'/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27', ....,
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7/site-packages']
_

出力から、PYTHONPATHが現在のプロジェクトフォルダーに設定されていることがわかります。

端末からの実行

次に、ターミナルから_somecode.py_を、変更を加えて実行します。

_$ python somecode.py
Traceback (most recent call last):
  File "somecode.py", line 2, in <module>
    print (os.environ['PYTHONPATH'])
  File "/Users/tarun.lalwani/.virtualenvs/folderstructure27/bin/../lib/python2.7/UserDict.py", line 40, in __getitem__
    raise KeyError(key)
KeyError: 'PYTHONPATH'
_

つまり、ターミナルで実行したときにPYTHONPATHがないことを示しています。 print(os.environ['PYTHONPATH'])コードを削除して、もう一度実行してみましょう。以下の出力が得られます

_['/Users/tarun.lalwani/Desktop/payu/projects/folderstructure27/folder1', ...
'/Users/tarun.lalwani/.virtualenvs/folderstructure27/lib/python2.7/site-packages']
Traceback (most recent call last):
  File "somecode.py", line 7, in <module>
    from utils.myutils1 import myclass
ImportError: No module named utils.myutils1
_

ご覧のとおり、_folder1_は_sys.path_を含むフォルダーであるため、_somecode.py_に追加されますが、ルートフォルダーは追加されていません。ターミナルでの修正は簡単です。これは、PYTHONPATHでルートディレクトリパスを設定することです。

_PYTHONPATH=`pwd`/.. python somcode.py
_

そして今、コードは端末からも動作します。

しかし、それらの動作方法はPython Consoleとは異なります。

重要な注意:リモートインタープリターでPyCharmを使用するPythonコンソール

リモートインタープリターオプションpycharmを使用してpythonコンソールを実行すると失敗します。これは、リモートサーバーのパスではなくローカルPCのパスを追加するためです。この問題を修正するにはローカルPCディレクトリとリモートサーバーパスの間にマッピングを追加する必要があります。 pycharmRemoteConfigpycharmRemoteConfig2

21
Tarun Lalwani

ここに同様のエラーがあり、これは私のために働いているようです:

Project Interpreterが次のように設定されていることを確認してください:C:\Python36\python.exe(私の場合)とどこか別のコピーではありません。

「ファイル」>「設定」>「プロジェクト____」>「プロジェクトインタープリター」

または、簡単に言えば、そのルートが協力していない場合は、workspace.xmlと手動で変更SDK_HOME PyCharmを開始する前:

<option name="SDK_HOME" value="C:\Python36\python.exe" />
0
gseattle

folder1フォルダー内でutilsパッケージを使用できます。

enter image description here

その後、コードはどちらの方法でも機能します。

from utils.myutils1 import myClass
0
y.luis