Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

config.py uses imp.load_source which is deprecated in Python 3 #214

Closed
pfmoore opened this issue Mar 5, 2015 · 7 comments
Closed

config.py uses imp.load_source which is deprecated in Python 3 #214

pfmoore opened this issue Mar 5, 2015 · 7 comments

Comments

@pfmoore
Copy link
Contributor

pfmoore commented Mar 5, 2015

In Python 3, imp.load_source is undocumented (apparently it was deprecated and removed via http://bugs.python.org/issue14551 with some discussion of how it is "fundamentally broken" in https://mail.python.org/pipermail/python-ideas/2014-December/030265.html).

On Windows under Python 3.3, the invoke tests fail somewhere in the compatibility implementation of imp.load_source.

An alternative approach to loading config from Python files should be implemented for Python 3. Would something like the following work?

import tokenize

values = {}
with tokenize.open(filename) as f:
    exec(f.read(), values)
@bitprophet
Copy link
Member

That's unfortunate, it's always worked fine under 3.3 and 3.4 on POSIX platforms for me.

The discussion thread linked implies the following could be the "correct" replacement for importing arbitrary files, and it works for me in a Python 3.4 shell:

from importlib.machinery import SourceFileLoader

mymodule = SourceFileLoader('modname', '/path/to/file.py').load_module()

So if that functions on your end I'd be +1 to a six.PY3 based branch which uses imp.load_source on Python 2 (importlib does not really exist in 2) and the above in Python 3.

@pfmoore
Copy link
Contributor Author

pfmoore commented Mar 5, 2015

I'll give that a go - I must admit I was getting a bit befuddled at that point and couldn't quite follow what the suggested alternative was meant to be...

@pfmoore
Copy link
Contributor Author

pfmoore commented Mar 5, 2015

Looks like SourceFileLoader doesn't exist on Python 3.2. So I've used it for 3.3 and later. Just pushed the change to my windows test fixes branch (because that one runs the tests on appveyor). I can make a separate PR of it once it's working.

@pfmoore
Copy link
Contributor Author

pfmoore commented Mar 5, 2015

OK, the big issue seems to be that if you try to use any of the load functions on Windows under Python 3.2, it breaks if the file doesn't exist. I'm trying to avoid the error by checking for file existence first. This is so messy, but I'm not sure we can do anything better as it's a Python bug. Unless you feel like dropping support for Python 3.2 ;-)

@pfmoore
Copy link
Contributor Author

pfmoore commented Mar 5, 2015

Yay! Working on Appveyor and Travis

@pfmoore
Copy link
Contributor Author

pfmoore commented Mar 5, 2015

PR #215 created for this

@bitprophet
Copy link
Member

Yaaay

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants