在Django中导入Python模块:__init__.py类未加载
下面这段代码在Python的命令行里运行得很好,可以显示feed对象的内容:
from pyalgotrade import strategy
from pyalgotrade.barfeed import yahoofeed
class MyStrategy(strategy.BacktestingStrategy):
def __init__(self, feed, instrument):
strategy.BacktestingStrategy.__init__(self, feed)
self.__instrument = instrument
def onBars(self, bars):
bar = bars[self.__instrument]
self.info(bar.getClose())
feed = yahoofeed.Feed()
feed.addBarsFromCSV("orcl","data/bistampTicker.csv")
myStrategy = MyStrategy(feed, "orcl")
myStrategy.run()
但是在Django的视图中执行时却出现了以下错误:
'function' object has no attribute 'BacktestingStrategy'
这里的BacktestingStrategy是一个在Python模块的strategy文件夹中的__ init__.py文件里定义的类,位于Python的路径中。
我理解这个问题是因为Django没有读取__ init__.py文件,所以没有正确导入这个模块(一个叫pyalgotrade的模块)。
有没有办法让Django去读取这个文件呢?
提前感谢你们,抱歉问了个初学者的问题。
祝好
4 个回答
试试这样做:
from pyalgotrade import strategy
print strategy
然后告诉我们你得到了什么结果。
你正在从一个叫 pyalgotrade
的模块中导入一个叫 strategy
的函数,这个函数是在那个模块里定义的。而这个 pyalgotrade.strategy
的子模块被这个函数给隐藏了。
你可能想写的是:
import pyalgotrade.strategy as strategy
在第一行。
Django其实就是Python:在Django中,所有在普通Python中发生的事情,关于模块的读取都是一样的。
无论如何,你对问题的判断是错误的:无法读取模块不会导致你看到的那个错误。错误信息说的是一个函数对象没有TestingStrategy这个属性。这意味着在某个地方,你把strategy
重新定义成了一个函数,而不是你最开始导入的那个模块。
修改库并不是一个真正的解决办法,这只是一种临时的解决方案。看看你遇到的错误:
'function' object has no attribute 'BacktestingStrategy'
这不是导入的问题:在某个地方你把 strategy
重新定义成了一个函数。不仅如此,我刚刚安装了 pyalgotrade
,然后做了以下操作,没有遇到任何问题:
>>> from pyalgotrade import strategy
>>> strategy.BacktestingStrategy
<class 'pyalgotrade.strategy.BacktestingStrategy'>
检查一下你导入的其他东西,确保你的命名没有搞混。
记住,Django 其实就是 Python;它并没有做什么特别的事情,是你在某些地方出错了。(这也是一个很好的学习机会!)