2017-11-28 4 views
0

に__init__.pyにsys.modules交換トリックを使うのですか私はhttps://stackoverflow.com/a/7668273/23845で説明sys.modules交換トリックを使用しようとしましたが、それは、Python 2で、次の場合には動作しません。はどのように私はPythonの2

# a/__init__.py 
import sys 

class AMod(object): 
    def __init__(self, d): 
     self.__dict__ = d 

sys.modules[__name__] = AMod(sys.modules[__name__].__dict__) 

そして:

最後に
# a/sub.py 
import a 

z = True 

# b.py 
import a.sub 

これは、ウィットに失敗h:

pymodshenanigans ezyang$ python b.py 
Traceback (most recent call last): 
    File "b.py", line 1, in <module> 
    import a.sub 
RuntimeError: sys.path must be a list of directory names 

これを行う方法はありますか? (これはPython 3で動作します)

+0

さて、何が 'この時点でsys.path'されますか? – kindall

+0

それは私のために働いています –

+1

それを交換する前にモジュールへの参照を保持する必要があります。 https://stackoverflow.com/questions/5365562/why-is-the-value-of-name-changing-after-assignment-to-sys-modules-name – martineau

答えて

0

@martineauが正しいです:古いモジュールへの参照を保持する必要があります。このバージョンでは動作します:

# a/__init__.py 
import sys 

class AMod(object): 
    def __init__(self, m): 
     self.__dict__ = m.__dict__ 
     self.old_mod = m 

sys.modules[__name__] = AMod(sys.modules[__name__])