2016-07-27 7 views
0

Pythonプロジェクトのテストや相対インポートに慣れていますが、Py3でテストしたときに問題が発生するまで、隣接モジュールからのインポートパッケージはPy2では動作しますが、Py3では動作しません

私はそうのような構造されたプロジェクトがあります。

Py2.7で scriptA import package as _package作品で
from scriptB import functionB 
from scriptC import functionC 

、しかしでPy3.5に失敗:

scriptA.py 
package/__init__.py 
      scriptB.py 
      scriptC.py 

__init.py__には、以下が含まれていますがエラー、ImportError: No module named 'scriptB'

packageをPy2と3の両方と互換性のある方法でインポートするにはどうすればよいですか?なぜこれは違うのですか?

私はimport .package as _packageをやってみましたが、それは(まだ... ...を使用する際に考え出す何も変更していないようだ

+0

暗黙の相対インポートを実行していると思いますが、これはPy3では使用できません。 'from __future__ import absolute_import'とタイプすると暗黙のrelが無効になります。 Py2でインポートし、Py3と同じエラーを発生させます。 @pbreachが示しているように "ドットを使う"はPy2/3互換の[explicit relative import](http://www.python.org/dev/peps/pep-0008/#imports)の例です。明示的な相対インポートまたは絶対インポートを使用してください。 – pylang

答えて

0

「scriptB」

は、パスのように見えるという名前のモジュールをエラーが発生しました。パスのステートメントを確認してください Windowsのパスステートメントには、スタートメニューの検索バーに "system"と入力するとアクセスできます。そこから "環境変数"にアクセスできます。 Pythonスクリプトがアクセスできる別のディレクトリを参照してください。P ython 3.xディレクトリとPython 3.x/scriptsディレクトリがリストされています。
パス・ステートメントにリストされているファイルは、プログラム内のグローバル変数のようなものです。 Python 2とPython 3の両方にというファイル名がディレクトリにある場合、互換性のないファイルにアクセスできます。私は、あなたが同じコンピュータ上で複数のバージョンのPythonを実行できるように、この問題を解決するPythonランチャーがあることを読んだことがあります。今の は、私はあなたのプログラム-run -reboot 、このバックアップファイルへのパスステートメントを-copying ことで、あなたの問題であり、その後のpython 2.xのに -remove参照かどうかをテストします。 複数のバージョンのpythonを実行する場合は、オリジナルのパス文をコピーして、Pythonランチャをインストールします。

+0

あなたのご意見ありがとうございます。あなたはもっと明確になりますか?あなたはsys.pathをチェックすることを意味しますか?もしそうなら、私は何をチェックしていますか?これは答えではないコメントです。 – pbreach

0

だから、問題は、私は、これはモジュールとPythonパッケージをインポートするとの違いの一つだと思い__init__.pyで輸入がすなわち相対的な輸入されている必要があること:

from .scriptB import functionB 
from .scriptC import functionC 

ました。 Py3.5では、相対的なインポートを明示的に行う必要があるため、エラーがスローされたようです。これは私の解釈です。不幸にも、私が質問に入れた構造は、私が持っていた問題に十分に近いものではなかったので、これで解決できません...しかし、これについてもっと詳細な(そしておそらく正確な)回答はまだ歓迎されています。

関連する問題