I want to import foo-bar.py. This works:
foobar = __import__("foo-bar")
This does not:
from "foo-bar" import *
My question: Is there any way that I can use the above format i.e., from "foo-bar" import * to import a module that has a - in it?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Starting from Python 3.1, you can use importlib :
import importlib
foobar = importlib.import_module("foo-bar")
( https://docs.python.org/3/library/importlib.html )
Method 2
you can’t. foo-bar is not an identifier. rename the file to foo_bar.py
Edit: If import is not your goal (as in: you don’t care what happens with sys.modules, you don’t need it to import itself), just getting all of the file’s globals into your own scope, you can use execfile
# contents of foo-bar.py baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>>
Method 3
If you can’t rename the module to match Python naming conventions, create a new module to act as an intermediary:
---- foo_proxy.py ----
tmp = __import__('foo-bar')
globals().update(vars(tmp))
---- main.py ----
from foo_proxy import *
Method 4
If you can’t rename the original file, you could also use a symlink:
ln -s foo-bar.py foo_bar.py
Then you can just:
from foo_bar import *
Method 5
Like other said you can’t use the “-” in python naming, there are many workarounds, one such workaround which would be useful if you had to add multiple modules from a path is using sys.path
For example if your structure is like this:
foo-bar ├── barfoo.py └── __init__.py
import sys
sys.path.append('foo-bar')
import barfoo
Method 6
in Python 3.6
I had the same problem “invalid syntax” when directly
import 'jaro-winkler' as jw
said
“No module named 'jaro-winkler'” when using:
jw = __import__('jaro-winkler')
and importlib.import_module() same.
finally i use pip uninstall the jaro-winkler module…just FYI
Method 7
This was my scenario: I have a python library cloned in a git submodule which has a dash in its name:
|- python-my-lib | `- mylib.py `- my-script.py
It took me a long time to figure out the equivalent of:
# Do NOT use this!
sys.path.insert(1, './my-lib')
from mylib import MyClass
Appending the path is not an option, as it would only work if you run the script within the same directory. If you do /home/user/bin/my-script.py, this will fail.
This is the solution:
import importlib
mylib_module = importlib.import_module("python-my-lib.mylib")
MyClass = mylib_module.MyClass
Feel free to further improve this solution, if you know a simpler solution.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0