'How to import module when module name has a '-' dash or hyphen in it?
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?
Solution 1:[1]
Starting from Python 3.1, you can use importlib :
import importlib
foobar = importlib.import_module("foo-bar")
Solution 2:[2]
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 *
Solution 3:[3]
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 *
Solution 4:[4]
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
Solution 5:[5]
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
Solution 6:[6]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Julien |
Solution 2 | Raymond Hettinger |
Solution 3 | gitaarik |
Solution 4 | Reda Drissi |
Solution 5 | Hassen Ch. |
Solution 6 | NicoHood |