自分のモジュールをPythonにインポートできない


141

Pythonでモジュールのインポートがどのように機能するかを理解するのに苦労しています(他の言語でもこれを行ったことはありません)。

私が持っているとしましょう:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

今私はこのようなものを得ようとしています:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

ただし、Pythonはそれmyappがモジュールであることを認識できないため、間違いなく何か間違ったことをしています。

ImportError: No module named myapp

回答:


95

特定のケースではSomeObject、myapp.pyスクリプトとTestCase.pyスクリプトからインポートしようとしているようです。myapp.pyから、

import SomeObject

同じフォルダにあるので。TestCase.pyの場合は、

from ..myapp import SomeObject

ただし、これは、パッケージからTestCaseをインポートする場合にのみ機能します。を直接実行するpython TestCase.py場合は、パスを変更する必要があります。これはPython内で実行できます。

import sys
sys.path.append("..")
from myapp import SomeObject

ただし、通常はお勧めしません。

一般に、他の人にPythonパッケージを使用させたい場合は、distutilsを使用してセットアップスクリプトを作成する必要があります。こうすることで、誰でもが次のようなコマンドを使用してパッケージを簡単にインストールできpython setup.py install、マシンのどこでも使用できるようになります。パッケージを真剣に考えている場合は、PythonパッケージインデックスのPyPIに追加することもできます。


私は単にimport私の中で使用してみましたTestCase.pyが、それでも同じエラーが発生しました。私はそれが__init__.py?のサブディレクトリにあるからだと思いますか?
n0pe

ああ、わかったと思う。テストケースがパッケージから呼び出されている場合、from ... import ...権利を使用できますか?
n0pe

1
TestCaseがパッケージの外部からインポートされている場合にのみ、たとえば、from myapp.tests import TestCase from a script outside myapp. If you're running testsフォルダー内でpython TestCase.py` を実行すると、相対インポートを実行できません
David Robinson

1
myappをインストールするには "pip install -e。"を実行しましたが、Visual StudioコードでTestCaseを実行しようとすると、 "ImportError:Noappという名前のモジュール"が表示されます。しかし、「python」を実行し、次にpythonで「from myapp import SomeObject」を実行すると、機能します。何が悪いのですか?
dagrun

@DavidRobinson私が実行した後にエラーを示さなかったあなたが言及している方法を使用しfrom fodername import file_name_of_my_py_codeますが、私はで定義されたオブジェクトにアクセスしようとしたときfile_name_of_my_py_code.pyにそれを言うNameError: name 'ClassName' is not defined
KavinラジュS

44

関数importはPYTHONPATH環境でファイルを探します。変数とローカルディレクトリ。したがって、すべてのファイルを同じディレクトリに配置するか、入力したパスをターミナルにエクスポートすることができます::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

2
それから、それを使用する他のすべての人に機能することを確認するにはどうすればよいですか?実行する前に特定の環境変数を設定するように指示する必要はありません。
n0pe

1
現在のディレクトリはpythonpathにあるため、スクリプトが同じフォルダー/ディレクトリにある限り、機能するはずです。残念ながら、これらのスクリプトはそれぞれ別のディレクトリにあります。
JKirchartz

4
Windowsユーザーの場合、代わりにexport"set PYTHONPATH =%PYTHONPATH%; C:\ path_to_myapp \ myapp \ myapp \"
loved.by.Jesus

vsコードでは、PYTHONPATH Env変数をlaunch.json: "env":{"PYTHONPATH": "$ {workspaceFolder}"}に追加することでこれを修正することができました
Michael Armitage

11

パスをエクスポートするのが良い方法です。もう1つの方法は、.pthをサイトパッケージの場所に追加することです。私のMacでは、Pythonが以下に示す/ Library / Pythonにサイトパッケージを保持しています

/Library/Python/2.7/site-packages

/library/Python/2.7/site-packages/awesome.pthにawesome.pthというファイルを作成し、そのファイルに、素晴らしいモジュールを参照する次のパスを追加しました

/opt/awesome/custom_python_modules

1
Windowsで作業している場合、どうすればよいですか
Nwawel A Iroume '10

よく分かりません。窓を使用している場合。いくつかのvmソフトウェアを見つけて、linuxを使用します。または-ウィンドウでの変数のエクスポートに関するこの回答を参照してください。stackoverflow.com/questions/559816/…–
jmontross

これがまさに私が必要としたものです
Lee88

1
@ Lee88-それを理解するのに少し時間がかかりました:)
jmontross

9

あなたが試すことができます

from myapp.myapp import SomeObject

プロジェクト名はmyapp.pyと同じであるため、最初にプロジェクトドキュメントが検索されます。


3

最初のmyappディレクトリで、uはsetup.pyファイルを追加し、setup.pyに2つのPythonコードを追加できます。

from setuptools import setup
setup(name='myapp')

コマンドラインの最初のmyappディレクトリで、pip install -eを使用します。パッケージをインストールする


2

pip installWindows 10では、デフォルトで「Program Files / PythonXX / Lib / site-packages」にインストールされます。これは、管理者権限が必要なディレクトリです。そこで、管理者としてpip installを実行して問題を修正 しました(管理者アカウントでログインしている場合でも、管理者としてコマンドプロンプトを開く必要があります)。また、pythonからpipを呼び出す方が安全です。
例えばの
python -m pip install <package-name>
代わりに
pip install <package-name>


0

私の場合、WindowsとPythonの驚きでしたが、Windowsのファイル名では大文字と小文字が区別されませんが、Pythonのインポートでは区別されます。したがって、Stuff.pyファイルがある場合は、この名前をそのままインポートする必要があります。


0

持っている必要があります

__init__.py

対話する必要のあるコードがあるすべてのフォルダ内。インポートしようとしたファイルが同じレベルであっても、すべてのインポートでプロジェクトの最上位フォルダー名を指定する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.