簡體   English   中英

如何導入名稱中包含點的包中的所有模塊?

[英]How do I import all modules in a package that contains a dot in its name?

這個鏈接的答案告訴我如何導入名稱中帶有點的單個模塊 ,但是如何從名稱中包含點的包中導入所有模塊:

from package.with.dot.in.name import *

我的文件看起來像這樣的地方:

package.with.dot.in.name/
    __init__.py
    module_1.py
    module_2.py

我知道在包名中有點是錯誤的。 它就在那里因為Sikuli要求你的“項目”被命名為“{project} .sikuli”。

基於這個答案和一些評論,我能夠做到:

name = 'package.with.dot.in.name'
pathname, description = imp.find_module(name)[1:]
package = imp.load_module(name, None, pathname, description)
locals().update(package.__dict__)

雖然我絕不會鼓勵這種行為,但你可以通過使用你導入的模塊的內部屬性字典來引用它來更新你的locals()

>>> r = __import__('requests')
>>> l = locals()
>>> l.update(r.__dict__)
>>> locals()['cookies']
<module 'requests.cookies' from '/usr/local/lib/python2.7/site-packages/requests/cookies.pyc'>

或者,換句話說:

>>> cookies
<module 'requests.cookies' from '/usr/local/lib/python2.7/site-packages/requests/cookies.pyc'>

編輯:使用下面的Jace自我答案,以下內容適用於帶點的文件名:

name = 'package.with.dot.in.name'
pathname, description = imp.find_module(name)[1:]
package = imp.load_module(name, None, pathname, description)
locals().update(package.__dict__)

嗯,就像Python中的幾乎所有東西一樣,導入系統是可以破解的。 您只需要創建一個自定義加載器並在sys.meta_path注冊它(有關詳細信息,請參閱PEP 302 )。

讓我們假設您想破解導入系統,以便在導入“foo_dot_bar”時加載“foo.bar”:

# search folder "foo.bar" and load it as a package
from foo_dot_bar import *     

請注意:這只是一個起點,它不是一個經過全面測試的解決方案; 事實上它超越了我的巫術水平!

# stupid_dot_importer.py
import os
import imp
import sys

class StupidDotPackageLoader(object):
    @staticmethod
    def _get_real_name(name):
        return ".".join(name.split('_dot_'))
    def find_module(self, name, path=None):
        try:
            imp.find_module(self._get_real_name(name))
        except ImportError:
            return None
        return self
    def load_module(self, name):
        _, pathname, description = imp.find_module(self._get_real_name(name))
        return imp.load_module(self._get_real_name(name), None, pathname, description)

假設您具有以下結構:

foo.bar
   |
   +--- __init__.py 
   |
   +--- module1.py
   |
   +--- module2.py

和:

$ cat foo.bar/__init__.py
from module1 import *
from module2 import *

$ cat foo.bar/module1.py
foo = 'bar'

$ cat foo.bar/module2.py
spam = 'eggs'

然后魔術:

>>> from stupid_dot_importer import *
>>> sys.meta_path = [StupidDotPackageLoader()]
>>> from foo_dot_bar import *
>>> foo
'bar'
>>> spam
'eggs'
>>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM