Mar*_*tin 10 python import gchart
对于我的Python应用程序,我有以下目录结构:
\myapp
\myapp\utils\
\myapp\utils\GChartWrapper\
\myapp\model\
\myapp\view\
\myapp\controller\
Run Code Online (Sandbox Code Playgroud)
\ myapp\view \中的一个类必须导入一个名为GChartWrapper的类.但是,我收到导入错误...
myview.py
from myapp.utils.GChartWrapper import *
Run Code Online (Sandbox Code Playgroud)
这是错误:
<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart
args = ('No module named GChartWrapper.GChart',)
message = 'No module named GChartWrapper.GChart'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我真的很难在Python中导入模块/类...
GChartWrapper包的__init__.py文件需要PYTHONPATH上的GChartWrapper包.你可以从第一行告诉:
from GChartWrapper.GChart import *
Run Code Online (Sandbox Code Playgroud)
是否有必要在包目录结构中包含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')))
Run Code Online (Sandbox Code Playgroud)
如果没有必要在目录结构中使用它,可以更容易将它安装在传统位置.您可以通过运行GChartWrapper源代码分发中包含的setup.py脚本来实现.
您不从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
Run Code Online (Sandbox Code Playgroud)
文件应为空,除了那些:
MyApp\myapp\utils\charts.py:
class GChartWrapper(object):
def __init__(self):
print "DEBUG: An instance of GChartWrapper is being created!"
Run Code Online (Sandbox Code Playgroud)
MyApp\myapp\view\__init__.py:
from myapp.utils.charts import GChartWrapper
def start():
c = GChartWrapper() # creating instance of the class
Run Code Online (Sandbox Code Playgroud)
MyApp\run.py:
from myapp.view import start
start()
Run Code Online (Sandbox Code Playgroud)
就这样!当您运行入口点(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']
)
Run Code Online (Sandbox Code Playgroud)
足够了.现在当人们下载MyApp文件夹时,他们可以使用setup.py安装它并使用run.py运行它.Distutils可以生成多种格式的包,包括可安装的窗口.EXE
这是分发python包/应用程序的标准方法.