Sixhobbits
Sixhobbits

Reputation: 1528

Flask debug depends on tkinter, sometimes

When I try to import non-standard modules into my Flask app with debug mode on and run it locally, the Flask server crashes with an ImportError for _tkinter. If I remove the import for the non-standard module, or turn off debug mode, everything works as expected.

Examples

The following runs fine, and "Hello, World" can be seen at localhost:5000

from flask import Flask
app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, World"

if __name__ == '__main__':
    app.run(debug=True)

If I add the following line at the top of the file

import dateparser

I get the following Traceback when I run the file:

flask@ubuntu:~/tkerr$ python app.py 
   * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
   * Restarting with stat
  Traceback (most recent call last):
    File "app.py", line 10, in <module>
      app.run(debug=True)
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 772, in run
      run_simple(host, port, self, **options)
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 622, in run_simple
      reloader_type)
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/_reloader.py", line 269, in run_with_reloader
      reloader.run()
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/_reloader.py", line 159, in run
      for filename in chain(_iter_module_files(), self.extra_files):
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/_reloader.py", line 70, in _iter_module_files
      for package_path in getattr(module, '__path__', ()):
    File "/usr/lib/python2.7/dist-packages/six.py", line 116, in __getattr__
      _module = self._resolve()
    File "/usr/lib/python2.7/dist-packages/six.py", line 105, in _resolve
      return _import_module(self.mod)
    File "/usr/lib/python2.7/dist-packages/six.py", line 76, in _import_module
      __import__(name)
    File "/usr/lib/python2.7/lib-tk/tkCommonDialog.py", line 11, in <module>
      from Tkinter import *
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 42, in <module>
      raise ImportError, str(msg) + ', please install the python-tk package'
  ImportError: No module named _tkinter, please install the python-tk package

For confirmation, with debug mode turned off everything runs as expected, even if I use the dateparser module. For example, the following shows "2015-01-01 00:00:00"

import dateparser
from flask import Flask
app = Flask(__name__)

@app.route("/")
def home():
    return str(dateparser.parse("1 jan"))

if __name__ == '__main__':
    app.run()

Importing any standard Python modules, such as

import json

works fine. But any other modules installed through pip cause the same issue.

If I run (as prompted by the error)

sudo apt-get install python-tk

Then the Traceback is replaced with an ImportError for _winreg

flask@ubuntu:~/tkerr$ python app.py 
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "app.py", line 11, in <module>
    app.run(debug=True)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 622, in run_simple
    reloader_type)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/_reloader.py", line 269, in run_with_reloader
    reloader.run()
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/_reloader.py", line 159, in run
    for filename in chain(_iter_module_files(), self.extra_files):
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/_reloader.py", line 70, in _iter_module_files
    for package_path in getattr(module, '__path__', ()):
  File "/usr/lib/python2.7/dist-packages/six.py", line 116, in __getattr__
    _module = self._resolve()
  File "/usr/lib/python2.7/dist-packages/six.py", line 105, in _resolve
    return _import_module(self.mod)
  File "/usr/lib/python2.7/dist-packages/six.py", line 76, in _import_module
    __import__(name)
ImportError: No module named _winreg

Details

Python 2.7.7; Ubuntu 14.04 (VMWare VM); Flask/Werkzeug 0.10.1

A solution would be appreciated, but more so I'd love to gain insight into what could cause Flask to require tkinter, considering it displays all debug output from within the web browser.

edit Add output from pip freeze

Flask==0.10.1
Jinja2==2.7.3
MarkupSafe==0.23
PAM==0.4.2
Pillow==2.3.0
PyMySQL==0.6.6
PyYAML==3.11
Twisted-Core==13.2.0
Twisted-Web==13.2.0
Werkzeug==0.10.1
adium-theme-ubuntu==0.3.4
apt-xapian-index==0.45
argparse==1.2.1
beautifulsoup4==4.4.1
ccsm==0.9.11.3
chardet==2.0.1
colorama==0.2.5
command-not-found==0.3
compizconfig-python==0.9.11.3
dateparser==0.3.0
debtagshw==0.1
defer==1.0.6
dirspec==13.10
duplicity==0.6.23
feedparser==5.1.3
html5lib==0.999
httplib2==0.8
itsdangerous==0.24
lockfile==0.8
lxml==3.3.3
oauthlib==0.6.1
oneconf==0.3.7
pexpect==3.1
piston-mini-client==0.7.5
pyOpenSSL==0.13
pycrypto==2.6.1
pycups==1.9.66
pycurl==7.19.3
pygobject==3.12.0
pyserial==2.6
pysmbc==1.0.14.1
python-apt==0.9.3.5
python-dateutil==2.4.2
python-debian==0.1.21-nmu2ubuntu2
pyxdg==0.25
reporter==0.1.2
reportlab==3.0
requests==2.2.1
sessioninstaller==0.0.0
six==1.5.2
software-center-aptd-plugins==0.0.0
system-service==0.1.6
unity-lens-photos==1.0
urllib3==1.7.1
virtualenv==1.11.4
wsgiref==0.1.2
xdiagnose==3.6.3build2
youtube-dl==2014.02.17
zope.interface==4.0.5

Upvotes: 0

Views: 473

Answers (1)

ScottMcC
ScottMcC

Reputation: 4460

I just tried running the following code on my Windows 10 machine and it worked fine for me.

Flask-Test.py

import dateparser
from flask import Flask
app = Flask(__name__)

@app.route("/")
def home():
    return str(dateparser.parse("1 jan"))

if __name__ == '__main__':
    app.run(debug=True)

I think there may be an issue with the python environment that you're currently working in. Perhaps try creating a virtual environment to operate out of using virtualenv to make sure that your environment is setup correctly.

If you would like to following along with the steps that I took to setup up a virtual environment to test the code, see below. The commands used might be slightly different when running from Ubuntu.

pip install virtualenv

Navigate to the folder where you have your test code saved and create the Virtual Environment using the following command

virtualenv env

Activate the virtual environment by navigating to the 'activate' file. In my case it was located at

.\venv\Scripts\activate

Download Flask and dateparser using pip

pip install Flask
pip install dateparser

Finally, activate the test file through the virtual environment

python .\Flasky-Test.py

Navigating to localhost returned a value of 2015-01-01 00:00:00 for me ok.

Edit

I just tried running your list of packages and managed to replicate the error that you were receiving. I believe the problem might be with the version of six that you are using. Try running

pip install six --upgrade

And let me know if that fixes the problem for you - it did for me.

Upvotes: 1

Related Questions