导入整个Python标准库

5
我需要一种方法将整个Python标准库导入到我的程序中。
虽然这似乎是不明智的做法,但我想这样做是为了让py2exe将整个标准库与我的程序捆绑在一起,这样我的用户可以从我提供的shell中导入它们。
是否有简便方法实现此操作?
额外加分项:我希望此操作不会导入我已安装在site-packages中且不随Python一起安装的包。然而,这并不是必须的。

1
什么?你正在编写一个通过预先导入所有内容启动的shell?有什么可能的用例吗?是为了节省用户输入“import this”十几个字符的时间吗? - S.Lott
1
它不会预先导入任何内容。但是为了让用户能够从stdlib中导入东西,我需要在我的程序中导入它们(或者看起来像我正在导入它们),这样py2exe就会知道我需要它们并将它们与我的可执行文件一起打包。 - Ram Rachum
3个回答

3

嘿,我突然想到一件事情:我只需要一个stdlib中所有模块的列表,然后我将自动生成一个Python脚本,手动导入每个模块,就像这样:

import re
import math
import time
# ...

然后将其与我的程序一起包含。

所以,现在我需要的只是一个易于格式化的所有stdlib模块/包的列表。现在我该如何获得?

更新:

我像这样获取列表:我在虚拟机上安装了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打包了整个stdlib。

更新:

我创建了一个可以实现此功能的软件包。我想上传它,但是我没有看到任何上传按钮,所以你可以从我的项目文件夹中获取它:

http://github.com/cool-RR/PythonTurtle/tree/master

它在src文件夹中,软件包名为almostimportstdlib,并已经有文档说明。


请点击此链接访问:http://docs.python.org/modindex.html需要进行一点复制粘贴和格式调整,但这是一个一次性的任务 :-) - fortran
1
我会个人动态生成它。看看我上面说的:你可以使用相同的方法来获取要包含的模块列表并从中生成文件。这比手动维护一个文件要好。 - jkp
@Ram 这么多年以后我突然看到了你的帖子,我们都在寻找解决 pyinstaller 相关问题的方法。我注意到 PythonTurtle 最近也转向了 pyinstaller,我很想知道你们是如何确保整个 stdlib 与其捆绑的。似乎与转换同时,你们还放弃了almostimportstdlib,但据我所知,pyinstaller 限制了实际被应用程序导入的捆绑包。如果你有任何提示,我将不胜感激,因为我的 Google 没有找到答案。 - Glutanimate

1

我从所有Python标准库创建了一个zip文件,然后在程序启动时将其添加到sys.path中。

你可以在这里查看源代码(已废弃的项目)。


非常好的想法。你应该能够使用py2exe将其捆绑为资源,并在应用程序加载后将其添加到路径中:至少我知道你可以使用PyInstaller来做到这一点。 - jkp

0

我在一个使用pyinstaller的应用程序中有同样的需求,并通过使用stdlib_list库和pyinstaller的隐藏导入来解决了这个问题。示例spec文件:

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版本相匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接