如何防止使用 py2exe 进行不必要的导入?

How to prevent unnecessary imports with py2exe?

我有一个包含以下导入语句的控制台脚本:

import pandas as pd
from time import time
from datetime import date, datetime, timedelta
import numpy as np
import sys

我正在尝试使用 py2exe 为此脚本创建一个 Windows 可执行文件,但遇到了一些麻烦,因为它似乎引入了它不需要的各种东西(过度热心的模块搜索,也许?)。

我正在使用以下 setup.py:

from distutils.core import setup
import py2exe
import numpy
import sys
import zmq
import os

sys.setrecursionlimit(5000)

os.environ["PATH"] = os.environ["PATH"] + \
                     os.path.pathsep + os.path.split(zmq.__file__)[0]

setup(
    console=['script.py'],
    data_files=[(".",["config_file.txt",])]
)

由于初始编译期间出现的错误,我不得不包括递归行和 zmq 的内容。编译适用于此示例,但会导致 dist/ 文件夹超过 300MB...

编译后,我可以看到它引入了matplotlibPILPySidePyQt等库,所有scipystatsmodeltclwxtornado 等。

有没有办法防止这些被导入?我假设它们在某种程度上是 pandasnumpy 的可选依赖项,但它们根本没有在脚本中使用,因为它只是一个控制台应用程序。

您可以按照 py2exe 的 OptimizingSize 页面中的建议手动排除不需要的包。我复制了他们的示例,以防页面消失。

   from distutils.core import setup
   import py2exe

   import sys; sys.argv.append('py2exe')

   py2exe_options = dict(
                 ascii=True,  # Exclude encodings
                 excludes=['_ssl',  # Exclude _ssl
                           'pyreadline', 'difflib', 'doctest', 'locale', 
                           'optparse', 'pickle', 'calendar'],  # Exclude standard library
                 dll_excludes=['msvcr71.dll'],  # Exclude msvcr71
                 compressed=True,  # Compress library.zip
                 )

   setup(name='<Name>',
         version='1.0',
         description='<Description>',
         author='Ofer Schwarz',

         console=['script.py'],
         options={'py2exe': py2exe_options},
         )