如何从当前脚本上方的目录导入模块

时间:2009-06-16 20:42:52

标签: python import gchart

对于我的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导入模块/类......

5 个答案:

答案 0 :(得分:7)

GChartWrapper包的__init__.py file需要PYTHONPATH上的GChartWrapper包。你可以从第一行告诉:

from GChartWrapper.GChart import *

是否需要在包目录结构中包含GChartWrapper包? 如果是这样,那么您可以做的一件事是在运行时添加程序包所在的路径到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脚本来实现此目的。

答案 1 :(得分:5)

您不从arbritary路径导入模块和包。相反,在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可以生成多种格式的包,包括可安装的窗口.EXE

这是分发python包/应用程序的标准方法。

答案 2 :(得分:2)

您可以更改python查找文件的路径。

在源文件的顶部,添加:

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

或者更改环境变量:

export PYTHONPATH=..

答案 3 :(得分: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

答案 4 :(得分:0)

也可以从PyPI获取GChartWrapper,因此您可以使用easy_install或pip来安装模块:

sudo pip install GChartWrapper==0.9

然后它会自动添加到您的PYTHONPATH中,然后您可以从/ myapp / utils目录中删除它。如果你不能使用sudo,请看看使用virtualenv(和virtualenvwrapper)。