python / flask:TypeError:需要一个整数(得到类型str)

时间:2015-07-29 18:26:18

标签: python flask

我是python和flask的新手。我正试图通过http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world的烧瓶教程。我遇到了一个我无法弄清楚的错误。我已经详尽地(我认为)搜索了一个解决方案,但我找不到适合我的问题的解决方案。我已经卸载并重新安装了烧瓶。我甚至创造了一个新的venv并重新开始,但没有任何效果。

我正在尝试构建一个简单的Web表单应用程序。我创建了一个表单:

from flask_wtf import Form  
from wtforms import StringField, BooleanField  
from wtforms.validators import DataRequired

class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)

当我导入LoginForm时,我收到错误

TypeError: an integer is required (got type str)

完整的堆栈跟踪在这里:

C:\microblog\flask\Scripts\python.exe C:/microblog/run.py
Traceback (most recent call last):
  File "C:/microblog/run.py", line 2, in <module>
    from app import app
  File "C:\microblog\app\__init__.py", line 6, in <module>
    from app import views
  File "C:\microblog\app\views.py", line 5, in <module>
    from .forms import LoginForm
  File "C:\microblog\app\forms.py", line 3, in <module>
    from flask_wtf import Form
  File "C:\microblog\flask\lib\site-packages\flask_wtf\__init__.py", line 15, in <module>
    from .form import Form
  File "C:\microblog\flask\lib\site-packages\flask_wtf\form.py", line 15, in <module>
    from .i18n import translations
  File "C:\microblog\flask\lib\site-packages\flask_wtf\i18n.py", line 12, in <module>
    from flask_babel import get_locale
  File "C:\microblog\flask\lib\site-packages\flask_babel\__init__.py", line 21, in <module>
    from babel import dates, numbers, support, Locale
  File "C:\microblog\flask\lib\site-packages\babel\dates.py", line 28, in <module>
    from babel.util import UTC, LOCALTZ
  File "C:\microblog\flask\lib\site-packages\babel\util.py", line 278, in <module>
    from babel import localtime
  File "C:\microblog\flask\lib\site-packages\babel\localtime\__init__.py", line 21, in <module>
from babel.localtime._win32 import _get_localzone
  File "C:\microblog\flask\lib\site-packages\babel\localtime\_win32.py", line 18, in <module>
    tz_names = get_global('windows_zone_mapping')
  File "C:\microblog\flask\lib\site-packages\babel\core.py", line 58, in get_global
    _global_data = pickle.load(fileobj)
TypeError: an integer is required (got type str)

感谢任何帮助 - 这让我疯了!

4 个答案:

答案 0 :(得分:5)

这是python包索引

上的babel 2.0包中的构建错误

https://github.com/mitsuhiko/babel/issues/174

总而言之,包中包含一个pickle文件babel/global.dat,python 3无法读取它,因为它是由在python 2下运行的脚本创建的。

我通过在github问题中建议从github而不是PyPI安装来解决这个问题:

pip install git+https://github.com/mitsuhiko/babel.git@2.0

答案 1 :(得分:1)

我在Windows上使用Python 3.4,我得到了同样的错误。

我为解决问题所做的是卸载烧瓶babel模块,如下所示:

flask\Scripts\pip uninstall flask-babel

之后仍然正确导入babel模块:

import babel

唯一的问题是我不明白这背后的理由。

答案 2 :(得分:0)

在与您完全相同的时间得到完全相同的问题 - 我很高兴看到它上面的stackoverflow页面只是看到它没有答案。我似乎找到了解决办法,但我要注意的事实是我不是专家,明天可能会发现这打破了别的东西。

根据core.py的依赖关系,我发现根据您运行的python版本,/ babel / _compat.py会导入cPickle或pickle,这是什么core.py正在导入为pickle。

我在/babel/_compat.py中更改了第22行

import cPickle as pickle

import pickle

并且看到一切都在工作。

同样,这可能已经打破了很多我不知道的事情,但是从我所读到的内容来看,似乎cPickle更快,所以这只会牺牲速度而不应该改变功能。如果你只是按照烧瓶教程,我怀疑这是一个问题。

答案 3 :(得分:0)

我的/babel/_compat.py版本已经有import pickle,所以我决定尝试卸载并重新安装flask-babel。在我卸载它之后,我只是出于好奇而运行了我的应用程序 - 它运行了!我希望我明白为什么,但我现在已经畅通无阻。