py2exe:排除要导入其所有部分的包的部分

时间:2014-07-15 00:30:13

标签: python python-2.7 py2exe

我正在尝试运行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

......没有运气。有谁知道如何解决这个问题?

2 个答案:

答案 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