10

对于我的 Python 应用程序,我有以下目录结构:

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

我在 \myapp\view\ 中的一个类必须导入一个名为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 包?如果是这样,那么您可以做的一件事是在运行时将包所在的路径添加到 sys.path。我认为它myview.pymyapp\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 回答