10

私の Python アプリケーションには、次のディレクトリ構造があります。

\myapp
\myapp\utils\
\myapp\utils\GChartWrapper\
\myapp\model\
\myapp\view\
\myapp\controller\

\myapp\view\ の私のクラスの 1 つは、GChartWrapperというクラスをインポートする必要があります。しかし、インポートエラーが発生しています...

myview.py
from myapp.utils.GChartWrapper import *

エラーは次のとおりです。

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart
      args = ('No module named GChartWrapper.GChart',)
      message = 'No module named GChartWrapper.GChart' 

私は何を間違っていますか?Pythonでモジュール/クラスをインポートするのに本当に苦労しています...

4

5 に答える 5

7

GChartWrapper パッケージの__init__.pyファイルは、PYTHONPATH 上の GChartWrapper パッケージを想定しています。最初の行で次のことがわかります。

from GChartWrapper.GChart import *

パッケージのディレクトリ構造に GChartWrapper を含むパッケージを含める必要がありますか? その場合、できることの 1 つは、実行時にパッケージが存在するパスを sys.path に追加することです。ディレクトリmyview.pyにあると思いますか?myapp\view次に、インポートする前にこれを行うことができますGChartWrapper

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

ディレクトリ構造に含める必要がない場合は、従来の場所にインストールする方が簡単な場合があります。これは、GChartWrapper ソース配布に含まれている setup.py スクリプトを実行することで実行できます。

于 2009-06-16T21:01:55.930 に答える
5

任意のパスからモジュールとパッケージをインポートしません。代わりに、python ではパッケージと絶対インポートを使用します。これにより、将来の問題はすべて回避されます。

例:

次のファイルを作成します。

MyApp\myapp\__init__.py
MyApp\myapp\utils\__init__.py
MyApp\myapp\utils\charts.py
MyApp\myapp\model\__init__.py
MyApp\myapp\view\__init__.py
MyApp\myapp\controller\__init__.py
MyApp\run.py
MyApp\setup.py
MyApp\README

次のファイルを除いて、ファイルは空である必要があります。

MyApp\myapp\utils\charts.py:

class GChartWrapper(object):
    def __init__(self):
        print "DEBUG: An instance of GChartWrapper is being created!"

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper

def start():
    c = GChartWrapper() # creating instance of the class

MyApp\run.py:

from myapp.view import start
start()

それで全部です!エントリ ポイント ( ) を実行するrun.pyと、ビューで関数が呼び出され、GChartWrapper クラスのインスタンスが作成されます。この構造を使用すると、どこにでも何でもインポートして使用できます。

補足MyApp\setup.pyとして、MyApp\myapp パッケージのインストール プログラムを作成します。distutilsを使用して、次のように記述します。

from distutils.core import setup
setup(name='MyApp',
      version='1.0',
      description='My Beautiful Application',
      author='Martin',
      author_email='martin@xxxxxxx.com',
      url='http://stackoverflow.com/questions/1003843/',
      packages=['myapp'],
      scripts=['run.py']
     )

それは十分です。MyApp フォルダーをダウンロードすると、setup.py を使用してインストールし、run.py を使用して実行するだけです。Distutils は、Windows にインストール可能な .EXE を含む多くの形式でパッケージを生成できます。

これは、python パッケージ/アプリケーションを配布する標準的な方法です。

于 2009-06-16T21:15:02.100 に答える
2

Python がファイルを探すパスを変更できます。

ソース ファイルの先頭に、次を追加します。

import sys
sys.path.append("..") 

または、代わりに環境変数を変更します。

export PYTHONPATH=..
于 2009-06-16T20:49:47.967 に答える
2

またはpython 2.5から始めます(再びmyviewがmyapp\viewにあると仮定します:

from __future__ import absolute_import
from ..utils.GChartWrapper import *

参照: http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

于 2009-06-16T21:10:36.397 に答える
0

GChartWrapper は PyPI からも入手できるため、easy_install または pip を使用してモジュールをインストールできます。

sudo pip install GChartWrapper==0.9

これは PYTHONPATH に自動的に追加され、/myapp/utils ディレクトリから削除できます。sudo を使用できない場合は、virtualenv (および virtualenvwrapper) の使用を検討してください。

于 2011-04-14T16:40:05.093 に答える