Python中如何解决打包.py文件到其他电脑运行时编译目录warn-testrun.txt缺失过多的问题?

missing module named 'xxx'的内容也太多了,起码>150 行
贴个前 10 的内容:

missing module named 'multiprocessing.forking' - imported by c:\users\administrator\appdata\local\programs\python\python36\lib\site-packages\PyInstaller\loader\rthooks\pyi_rth_multiprocessing.py (optional)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.SimpleQueue - imported by multiprocessing (top-level), concurrent.futures.process (top-level)
missing module named 'win32com.gen_py' - imported by win32com (conditional, optional), c:\users\administrator\appdata\local\programs\python\python36\lib\site-packages\PyInstaller\loader\rthooks\pyi_rth_win32comgenpy.py (top-level)
missing module named pyimod03_importers - imported by PyInstaller.loader.pyimod02_archive (delayed, conditional), c:\users\administrator\appdata\local\programs\python\python36\lib\site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py (top-level)
missing module named 'com.sun' - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
missing module named com - imported by pkg_resources._vendor.appdirs (delayed)

脚本状态下,程序运行没有问题
就拿第一个“'multiprocessing”来说,我手动 pip install multiprocessing 都报错了。。。

    ERROR: Command errored out with exit status 1:
     command: 'c:\users\administrator\appdata\local\programs\python\python36\python.exe' -c 'import sys, setuptools, to
kenize; sys.argv[0] = '"'"'C:\\Temp\\pip-install-bi2klhf4\\multiprocessing\\setup.py'"'"'; __file__='"'"'C:\\Temp\\pip-
install-bi2klhf4\\multiprocessing\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().repl
ace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-
info
         cwd: C:\Temp\pip-install-bi2klhf4\multiprocessing\
    Complete output (6 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Temp\pip-install-bi2klhf4\multiprocessing\setup.py", line 94
        print 'Macros:'
                      ^
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print('Macros:')?
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

很像是 python 版本的问题。。。 但又不能降 python 版本这么折腾。。。

要编译成功,有何办法???


Python中如何解决打包.py文件到其他电脑运行时编译目录warn-testrun.txt缺失过多的问题?

13 回复

你运行的这个程序用到的 multiprocessing 是 python2.7 的,只能用 python2.7,你在 3.6 里用不了
multiprocessing 3.6 都内置了,pip 安装以前的当然装不上


我遇到过这个问题,通常是因为打包工具没处理好项目结构。核心是要确保打包配置正确包含所有必要的文件。

以PyInstaller为例,这是最常用的解决方案:

# 首先确保你的项目结构清晰:
# your_project/
#   ├── main.py          # 主程序入口
#   ├── config/
#   │   ├── settings.py
#   │   └── warn-testrun.txt  # 你的配置文件
#   └── data/
#       └── other_files.txt

# 方法1:使用PyInstaller的--add-data参数(命令行方式)
# 在项目根目录执行:
# pyinstaller --onefile --add-data "config/warn-testrun.txt;config" main.py

# 方法2:使用spec文件(更推荐)
# 先生成spec文件:pyinstaller --onefile main.py
# 然后编辑main.spec文件:

# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[('config/warn-testrun.txt', 'config')],  # 关键在这里
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)

pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,  # 这里会包含上面datas配置的文件
    [],
    name='main',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

# 保存后运行:pyinstaller main.spec

# 方法3:在代码中动态处理(如果文件不多)
import sys
import os

def get_resource_path(relative_path):
    """获取资源文件的绝对路径,兼容开发环境和打包后环境"""
    if hasattr(sys, '_MEIPASS'):
        # 打包后的临时目录
        base_path = sys._MEIPASS
    else:
        # 开发环境
        base_path = os.path.abspath(".")
    
    return os.path.join(base_path, relative_path)

# 使用示例
config_file = get_resource_path("config/warn-testrun.txt")
with open(config_file, 'r') as f:
    content = f.read()

关键点:确保在打包配置中明确包含所有非.py文件,特别是配置文件、数据文件等。PyInstaller默认只打包.py文件,其他文件需要手动指定。

总结:检查打包配置,确保包含所有必要文件。

看来没办法了,有几个用到的库,只能在 3.6 以上使用。。。。

我来歪个楼,楼主的用户名“administrator”,怕不是暴露了你还在用 XP 😂?

新版 Windows 也一直沿用 administrator 这个用户名啊。。
用这种默认用户名,可以降低终端 prompt,文档作者,配置文件,日志,路径,编译调试信息等各方面暴露个人信息的可能。

没记错的话从 Windows 7 开始就会让用户自己创建一个系统账号了,不会直接使用 Administrator。
另外不想暴露个人信息的话你还可以把用户名设成 123 abc 之类的。

Python 3.5 是最后支持 XP 的版本。

你需要 pyinstaller

印象中用 7 的时候还是用的 administrator,可能不是官方安装系统,后来到 10 是引导建一个普通用户,但也可以手动启用 administrator 并登录啊。。

Win7,我做系统的时候特意用回 Administrator
这不就是用了 pyinstaller 来编译的么?

你需要 pyinstaller +1

你需要新建一个干净的虚拟环境,pyinstaller 好像会把所有的包都打包进去

要彻底解决,只有换 golang

回到顶部