【问题标题】:Importing the entire Python standard library导入整个 Python 标准库
【发布时间】:2009-07-30 14:06:50
【问题描述】:

我需要一种将整个 Python 标准库导入我的程序的方法。

虽然这似乎是个坏主意,但我想这样做是为了让 py2exe 将整个标准库与我的程序一起打包,这样我的用户就可以在我给他们的 shell 中从它导入。

有没有简单的方法可以做到这一点?

加分项:我希望此操作不会导入我已安装在站点包中且 Python 未附带的包。但是,这并不重要。

【问题讨论】:

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

标签: python import packaging py2exe


【解决方案1】:

嘿,我刚想到一件事:我只需要 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 打包整个标准库。

更新:

我创建了一个包来执行此操作。我会在这里上传它,但由于我没有看到任何上传按钮,你可以从我的项目文件夹中取出它:

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

它在文件夹src 中,包名为almostimportstdlib 并记录在案。

【讨论】:

  • docs.python.org/modindex.html 它会带你一点点复制粘贴和格式化,但这是一次性的任务:-)
  • 我会亲自动态生成它。看看我上面所说的:您可以使用相同的方法获取要包含的模块列表并从中生成文件。这比必须手动维护要好。
  • @Ram 这些年来这有点随机,但我只是偶然发现了你的帖子,正在寻找与 pyinstaller 相同的解决方案。我注意到 PythonTurtle 最近也切换到了 pyinstaller,我想知道你们是如何设法确保整个 stdlib 都与它捆绑在一起的。似乎您在开关旁边丢弃了almostimportstdlib,尽管据我所知,pyinstaller 还将捆绑包限制为应用程序实际导入的包。如果您对此有任何提示,我将不胜感激,因为到目前为止我的 Google-Fu 让我失望了。
【解决方案2】:

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

你可以看看源代码here(废弃项目)

【讨论】:

  • V.好主意。您应该能够使用 py2exe 将其捆绑为资源,并在应用程序加载后将其添加到路径中:我知道您至少可以使用 PyInstaller 做到这一点。
【解决方案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 版本相匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2020-10-04
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多