Pythonは同じフォルダでモジュールを見つけることができません


97

私のPythonはどういうわけか同じディレクトリでモジュールを見つけることができません。私は何が間違っているのですか?(python2.7)

したがって、1つのディレクトリ「2014_07_13_test」があり、その中に2つのファイルがあります。

  1. test.py
  2. hello.py

ここでhello.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

およびtest.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

それでもPythonは私に

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

どうしましたか?


2
スクリプトをどのように実行していますか?また、出力は何import sys; sys.path
セーラム

1
試してみてください>>> import test
martineau 2014

@Casy_fillファイルが存在するディレクトリからプログラムを実行しますか?インポートの場合、インポートファイルとインポートファイルがディレクトリを共有することは重要ではありません。重要なのは、Pythonインタープリターに現在のディレクトリが正しく設定されていることです。
Jan Vlcinsky 2014

回答:


79

あなたのコードは大丈夫です、私はあなたの問題があなたがそれをどのように起動しているかにあると思います。

'2014_07_13_test'ディレクトリからPythonを起動する必要があります。

コマンドプロンプトを開き、「cd」を「2014_07_13_test」ディレクトリに挿入します。

例えば:

$ cd /path/to/2014_07_13_test
$ python test.py

このようなディレクトリに「cd」できない場合は、sys.pathに追加できます。

test.pyの場合:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

または、PYTHONPATHを設定/編集します

そして、すべてがうまくいくはずです...

...「shebang」行(両方のファイルの最初の行)にわずかな間違いがあります。「#」と「!」の間にスペースがあってはなりません。

あり、より良いシェバングあなたが使用する必要がありますが。

また、すべてのファイルにシバン行は必要ありません...実行可能ファイルとしてシェルから実行する予定のファイルのみです。


どうもありがとう、その問題!残念ながら、SublimeRepl(私が使用している)は現在、フォルダーからのpythonの起動をサポートしていないため、今すぐPATHをエクスポートする必要があるようです
Philipp_Kats 2014

後の読者は、ページの最後まで読んで、他の非常に役立つ回答を確認してください。たとえば、相対インポートに関するjfnからの回答などです。
HongboZhu

うん、これは私の問題だった。VS CodeでPython練習プロジェクトの大きなフォルダーを開いていましたが、同じディレクトリで物を見つけるのに大きな問題がありました。私の問題は、ターミナルで、現在のプロジェクトが含まれているサブディレクトリにディレクトリを変更していなかったことです。変更すると、問題は解決しました。
マットウェスト

105

test.pyのインポートを次のように変更します。

from .hello import hello1

23
他の誰かが後でこれを見つけた場合、これは相対インポートと呼ばれ、python 2.5で追加されました: docs.python.org/2.5/whatsnew/pep-328.html
sgfit

9
モジュール全体の使用インポートするにはfrom . import hello
ST7

これは、最も受け入れられている答えよりも優れた解決策だと思います。ST7が指摘したように私は、モジュール全体のインポートを使用しますfrom . import local_module
ジーンM

25

同様の問題がありました。ファイルのディレクトリをパスリストに明示的に追加することで解決しました。

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

その後、同じディレクトリからのインポートに問題はありませんでした。


2
これは機能しましたが、相対インポートを使用したjwnからの回答は、はるかにクリーンなソリューションでした。
Russ Schultz

16

これが私が使用する一般的なソリューションです。同じフォルダ内のモジュールからインポートする場合の問題を解決します。

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

これをモジュールの先頭に配置すると、「xxxxという名前のモジュールがありません」というエラーが表示されます。


1
これは、「..」を「../ ..」に置き換えることで、親ディレクトリからモジュールをロードするのに役立ちました。どうもありがとう!
ニコラ

1
あるファイルインポートするファイルの名前や、我々はモジュールをインポートしている現在のモジュールまたはそれが一定である
Manojさん

9

私の場合、コードをハイフン付きのモジュール内に配置したため、Pythonはそれを見つけることができませんでしたmy-module。私がそれを変更したとき、my_moduleそれはうまくいきました。


1

私はこの問題に遭遇しました。同じディレクトリに3つのフォルダがあるので、どのフォルダを指定する必要がありました。例:フォルダインポートスクリプトから


0

以下はOPの問題を解決しませんが、タイトルとエラーはまさに私が直面したものです。

プロジェクトにsetup.pyスクリプトが含まれている場合は、python3 -m pip install -e .またはをpython3 setup.py install使用してpython3 setup.py develop、現在のパッケージをインストールできます。このパッケージはインストールされますが、編集可能です(したがって、パッケージのインポート時にコードへの変更が表示されます)。がない場合はsetup.py意味があります

とにかく、OPが直面する問題はもう存在しないようですか?

ファイルone.py

def function():
    print("output")

ファイルtwo.py

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

他の解決策は「汚い」ようです

2つのテストファイルがあるOPの場合、それらを機能するように変更することはおそらく問題ありません。ただし、他の実際のシナリオでは、他の回答にリストされている方法はおそらく推奨されません。それらは、Pythonコードを変更するか、柔軟性を制限する(特定のディレクトリからPythonファイルを実行する)必要があり、一般的に煩わしさをもたらします。プロジェクトのクローンを作成したばかりで、これが発生した場合はどうなりますか?おそらくすでに他の人のために機能しており、コードを変更する必要はありません。選択した回答では、特定のフォルダーからスクリプトを実行して、スクリプトを機能させることも求められています。これは長期的な迷惑の原因となる可能性があり、決して良いことではありません。また、特定のpythonフォルダーをPATHに追加することもお勧めします(pythonまたはコマンドラインから実行できます)。繰り返しますが、数か月以内にフォルダの名前を変更したり移動したりするとどうなりますか?このページをもう一度探す必要があります、そして最終的には、パスを設定する必要があること(そして、数か月前にこれを正確に行ったこと)、およびパスを更新するだけでよいことを発見します(sys.pathを使用してプログラムで設定できることを確認してください。ただし、これはまだ不安定な場合があります。 )。大きな迷惑の多くの原因。

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