我正在尝试运行py2exe并最小化第三方依赖项。我试图只包括一个巨大的第三方软件包中必不可少的部分,但是无法弄清楚如何防止软件包的__init__.py
,它导入了许多我不想要的东西,而不是在运行时调用。
总结了这种情况:
myscript.py: from BigPackage.SmallSubset import TheOnlyFunctionIReallyNeed
BigPackage/__init__.py: import SmallSubset, HugeUnwantedSubset
BigPackage/SmallSubset.py: import AcceptableDependencies
BigPackage/HugeUnwantedSubset.py: import UnacceptablyHugeDependencies
问题是,即使我成功包含BigPackage
的某些部分而不是其他部分,但在运行时调用import BigPackage.SmallSubset
时,BigPackage/__init__.py
先运行,然后尝试导入排除部分因此引发例外。如果我可以说服py2exe包含BigPackage/SmallSubset.py
但不 BigPackage/__init__.py
,那会有用,但我没有运气让py2exe理解这个想法。我在setup.py
中尝试了以下内容:
import BigPackage # let's try a Deny/Allow approach:
options[ 'py2exe' ][ 'excludes' ].append( 'BigPackage' )
options[ 'py2exe' ][ 'includes' ].append( 'BigPackage.SmallSubset' )
# nope, py2exe fails with 'ImportError: No module named BigPackage' in py2exe/mf.py
...和/或:
import BigPackage # this seems less plausible, but worth a try:
options[ 'py2exe' ][ 'excludes' ].append( 'BigPackage.__init__' )
# nope, __init__.pyc still turns up in dist
...和/或:
import BigPackage # really getting desperate now:
options[ 'py2exe' ][ 'excludes' ].append( BigPackage.__file__ )
# nope, __init__.pyc still turns up in dist
......没有运气。有谁知道如何解决这个问题?
答案 0 :(得分:0)
如果不修补BigPackage库,则无法实现所需。
答案 1 :(得分:0)
所有解决方案充其量都是hackish(请参阅问题评论)。但不是后期修复__init__.py
我最终确定了以下策略:进入并解除我需要的特定事物,并将它们复制到临时文件中:
import sys, os, shutil
# awkward kludge to include BigPackage.SmallSubset by hand without having to include the rest of BigPackage
src = [ os.path.join( x, 'BigPackage', 'SmallSubset.py' ) for x in sys.path ]
src = [ x for x in src if os.path.isfile( x ) ][ 0 ]
shutil.copyfile( src, 'BigPackageSmallSubset.py' )
import BigPackageSmallSubset
options = { 'py2exe': { 'excludes' : [ 'BigPackage' ], 'includes' : [ 'BigPackageSmallSubset' ], 'compressed' : True, }, }
# setup( ..., options=options, ... )
os.remove( 'BigPackageSmallSubset.py' )
os.remove( 'BigPackageSmallSubset.pyc' )
然后我让myscript.py
对可能存在的差异敏感:
try: from BigPackage.SmallSubset import TheOnlyFunctionIReallyNeed
except ImportError: from BigPackageSmallSubset import TheOnlyFunctionIReallyNeed