How to import module when module name has a '-' dash or hyphen in it?

后端 未结 5 1881
遇见更好的自我
遇见更好的自我 2020-11-28 03:27

I want to import foo-bar.py. This works:

foobar = __import__(\"foo-bar\")

This does not:

from \"foo-bar\" import *
<         


        
相关标签:
5条回答
  • 2020-11-28 03:42

    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 *
    
    0 讨论(0)
  • 2020-11-28 03:52

    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
    
    0 讨论(0)
  • 2020-11-28 03:54

    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 )

    0 讨论(0)
  • 2020-11-28 04:06

    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'
    >>> 
    
    0 讨论(0)
  • 2020-11-28 04:08

    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 * 
    
    0 讨论(0)
提交回复
热议问题