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

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中导入模块/类真的很困难...

5个回答

7

GChartWrapper包的__init__.py文件期望在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脚本来执行此操作。

我正在尝试在App Engine上使用GChartWrapper,所以我无法真正运行设置。谢谢! :) - Martin

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='https://dev59.com/9XNA5IYBdhLWcg3wVcP6
      packages=['myapp'],
      scripts=['run.py']
     )

就这些内容已经足够了。现在,当用户下载 MyApp 文件夹时,他们只需使用 setup.py 进行安装,然后使用 run.py 运行即可。Distutils 可以生成多种格式的软件包,包括 Windows 安装文件 .EXE。

这是分发 Python 软件包/应用程序的标准方式。


2
你可以更改python查找文件的路径。
在你的源代码文件顶部添加以下内容:
import sys
sys.path.append("..") 

或者更改环境变量:

export PYTHONPATH=..

2

0
GChartWrapper也可以从PyPI获得,因此您可以使用easy_install或pip安装模块:
sudo pip install GChartWrapper==0.9

然后它将自动添加到您的PYTHONPATH中,然后您可以从/myapp/utils目录中删除它。如果您无法使用sudo,请考虑使用virtualenv(和virtualenvwrapper)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接