私は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'という名前のモジュールはありません
プロジェクト内のモジュールの適切なフォルダー構造に関する推奨事項、およびそれらを適切にインポートする方法
ありがとう!
答えを説明するために、私はあなたが持っていたプロジェクト構造を再作成しました
_/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を起動すると、設定を使用して実行されるコードがいくつかあります。
ご覧のとおり、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つのオプションがあります。
_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ディレクトリとリモートサーバーパスの間にマッピングを追加する必要があります。
ここに同様のエラーがあり、これは私のために働いているようです:
Project Interpreterが次のように設定されていることを確認してください:C:\Python36\python.exe
(私の場合)とどこか別のコピーではありません。
「ファイル」>「設定」>「プロジェクト____」>「プロジェクトインタープリター」
または、簡単に言えば、そのルートが協力していない場合は、workspace.xml
と手動で変更SDK_HOME
PyCharmを開始する前:
<option name="SDK_HOME" value="C:\Python36\python.exe" />