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