导入整个Python标准库
我需要一种方法,把整个Python标准库导入到我的程序里。
虽然这听起来可能不是个好主意,但我想这样做是为了让py2exe把整个标准库打包到我的程序里,这样我的用户就可以在我提供的命令行中使用这些库。
有没有简单的方法可以做到这一点呢?
附加要求:我希望这个操作不会导入我在site-packages里安装的那些不是Python自带的包,不过这不是特别重要。
3 个回答
我在一个使用 pyinstaller 的应用中也遇到了同样的需求,我是通过使用 stdlib_list 库和 pyinstaller 的隐藏导入来解决的。下面是一个示例的配置文件:
from stdlib_list import stdlib_list
hidden_imports = []
hidden_imports.extend(stdlib_list("3.9"))
a = Analysis(['myapp.py'],
pathex=["."],
binaries=[],
datas=[],
hiddenimports=hidden_imports,
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
...
这里的版本必须和你在应用中使用的 Python 版本一致。
我把所有的Python标准库打包成了一个zip文件,然后在程序启动时把这个zip文件添加到了sys.path
里。
你可以在这里查看源代码(这个项目已经停止维护了)。
嘿,我刚想到一个主意:我只需要一个包含所有标准库模块的列表,然后我就可以自动生成一个Python脚本,手动导入每一个模块,就像这样:
import re
import math
import time
# ...
然后把这个脚本包含到我的程序里。
所以现在我需要的就是一个格式简单的标准库模块/包的列表。那我该怎么得到这个列表呢?
更新:
我这样得到了列表:我在一个虚拟机上安装了Python 2.6,然后在IDLE中运行:
import pkgutil
stuff = [thing[1] for thing in pkgutil.iter_modules()]
stuff.sort() # To make it easy to look through
print(stuff)
然后把输出复制粘贴到我的IDE里,写了一个小脚本:
if False:
import re
import email
import time
# ...
把它放进一个我在程序中导入的Python模块里。
这样可以!py2exe可以打包整个标准库。
更新:
我创建了一个可以做到这一点的包。我本来想在这里上传,但我没看到上传按钮,你可以从我的项目文件夹下载:
http://github.com/cool-RR/PythonTurtle/tree/master
它在src
文件夹里,包的名字叫almostimportstdlib
,而且有文档说明。