尝试冻结 Python 3.6.5 应用程序时出现 _sysconfigdata 错误
_sysconfigdata error when trying to Freeze a Python 3.6.5 application
我正在尝试将 Python 3.6.5 应用冻结为 Linux(Fedora 27 64 位)上的独立可执行文件,使用默认 Python freeze.py
公用事业。我有一个 Python 3.6.5 编译的签出,我正在尝试使用以下(已清理)命令冻结我的应用程序:
LOCAL_PYTHON=(path to my compiled local python directory)
$LOCAL_PYTHON/python $LOCAL_PYTHON/Tools/freeze/freeze.py -p $LOCAL_PYTHON
-P $LOCAL_PYTHON -o frozen myapp.py
这个冻结命令似乎工作正常,并像我期望的那样生成 myapp
可执行文件,但是 运行 宁可执行文件抛出以下异常:
Failed to import the site module
Traceback (most recent call last):
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 955, in _find_and_load_unlocked
module = _load_unlocked(spec)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 665, in _load_unlocked
spec.loader.exec_module(module)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 807, in exec_module
exec(code, module.__dict__)
File "$LOCAL_PYTHON/Lib/site.py", line 544, in <module>
main()
File "$LOCAL_PYTHON/Lib/site.py", line 530, in main
known_paths = addusersitepackages(known_paths)
File "$LOCAL_PYTHON/Lib/site.py", line 282, in addusersitepackages
user_site = getusersitepackages()
File "$LOCAL_PYTHON/Lib/site.py", line 258, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "$LOCAL_PYTHON/Lib/site.py", line 248, in getuserbase
USER_BASE = get_config_var('userbase')
File "$LOCAL_PYTHON/Lib/sysconfig.py", line 601, in get_config_var
return get_config_vars().get(name)
File "$LOCAL_PYTHON/Lib/sysconfig.py", line 550, in get_config_vars
_init_posix(_CONFIG_VARS)
File "$LOCAL_PYTHON/Lib/sysconfig.py", line 421, in _init_posix
_temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 953, in _find_and_load_unlocked
raise ModuleNotFoundError(_ERR_MSG.format(name), name=name)
ModuleNotFoundError: No module named '_sysconfigdata_m_linux_x86_64-linux-gnu'
如果我 运行 它没有冻结(例如 $LOCAL_PYTHON/python myapp.py
),我的应用程序工作正常,并且相同的冻结命令和应用程序在 Windows 上生成一个工作的可执行文件。是否缺少某些平台特定的冻结参数或环境变量?
所以我能够使用 docker 重现该问题。我运行一个docker容器使用下面
docker run -it fedora:27 bash
然后 运行 下面的命令从源
设置 python
yum install -y git gcc unzip zip wget curl make cmake zlib-devel libsq3-devel readline-devel openssl-devel which vim findutils
mkdir py
cd py/
wget "https://github.com/python/cpython/archive/v3.6.5.zip"
unzip v3.6.5.zip
cd cpython-3.6.5/
./configure --with-debug
make -j8
之后我创建了一个简单的 app.py
print('this is from app')
然后我运行
export LANG=en_US.UTF-8
LOCAL_PYTHON=/py/cpython-3.6.5/
$LOCAL_PYTHON/python $LOCAL_PYTHON/Tools/freeze/freeze.py -p $LOCAL_PYTHON -P $LOCAL_PYTHON -o frozen app.py
cd frozen/
make
./app
我得到了以下异常
[root@54ba4757d177 frozen]# ./app
Failed to import the site module
Traceback (most recent call last):
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 955, in _find_and_load_unlocked
module = _load_unlocked(spec)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 665, in _load_unlocked
spec.loader.exec_module(module)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 807, in exec_module
exec(code, module.__dict__)
File "/py/cpython-3.6.5/Lib/site.py", line 544, in <module>
main()
File "/py/cpython-3.6.5/Lib/site.py", line 530, in main
known_paths = addusersitepackages(known_paths)
File "/py/cpython-3.6.5/Lib/site.py", line 282, in addusersitepackages
user_site = getusersitepackages()
File "/py/cpython-3.6.5/Lib/site.py", line 258, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "/py/cpython-3.6.5/Lib/site.py", line 248, in getuserbase
USER_BASE = get_config_var('userbase')
File "/py/cpython-3.6.5/Lib/sysconfig.py", line 601, in get_config_var
return get_config_vars().get(name)
File "/py/cpython-3.6.5/Lib/sysconfig.py", line 550, in get_config_vars
_init_posix(_CONFIG_VARS)
File "/py/cpython-3.6.5/Lib/sysconfig.py", line 421, in _init_posix
_temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 953, in _find_and_load_unlocked
raise ModuleNotFoundError(_ERR_MSG.format(name), name=name)
ModuleNotFoundError: No module named '_sysconfigdata_m_linux_x86_64-linux-gnu'
和你一样。然后我运行make install
安装python再试
make install -C /py/cpython-3.6.5/
然后再次应用程序
[root@54ba4757d177 frozen]# ./app
this is from app
并且有效,所以我了解到问题是生成的应用程序假定 python 已安装在计算机上。然后我找到了
形式的黄金
Python freeze.py generated bin doesn't run
我更新了 /py/cpython-3.6.5/Tools/freeze/makefreeze.py
文件并在 PyImport_FrozenModules = _PyImport_FrozenModules;
之前添加了 Py_NoSiteFlag = 1;
。
当然,我再次创建容器以确保系统上没有安装 python。然后再次重新编译应用程序,宾果游戏!
[root@06284cc1ae0c frozen]# ./app
this is from app
更进一步,我再次删除了所有 python 源、构建文件和 运行 应用程序,效果很好
我正在尝试将 Python 3.6.5 应用冻结为 Linux(Fedora 27 64 位)上的独立可执行文件,使用默认 Python freeze.py
公用事业。我有一个 Python 3.6.5 编译的签出,我正在尝试使用以下(已清理)命令冻结我的应用程序:
LOCAL_PYTHON=(path to my compiled local python directory)
$LOCAL_PYTHON/python $LOCAL_PYTHON/Tools/freeze/freeze.py -p $LOCAL_PYTHON
-P $LOCAL_PYTHON -o frozen myapp.py
这个冻结命令似乎工作正常,并像我期望的那样生成 myapp
可执行文件,但是 运行 宁可执行文件抛出以下异常:
Failed to import the site module
Traceback (most recent call last):
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 955, in _find_and_load_unlocked
module = _load_unlocked(spec)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 665, in _load_unlocked
spec.loader.exec_module(module)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 807, in exec_module
exec(code, module.__dict__)
File "$LOCAL_PYTHON/Lib/site.py", line 544, in <module>
main()
File "$LOCAL_PYTHON/Lib/site.py", line 530, in main
known_paths = addusersitepackages(known_paths)
File "$LOCAL_PYTHON/Lib/site.py", line 282, in addusersitepackages
user_site = getusersitepackages()
File "$LOCAL_PYTHON/Lib/site.py", line 258, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "$LOCAL_PYTHON/Lib/site.py", line 248, in getuserbase
USER_BASE = get_config_var('userbase')
File "$LOCAL_PYTHON/Lib/sysconfig.py", line 601, in get_config_var
return get_config_vars().get(name)
File "$LOCAL_PYTHON/Lib/sysconfig.py", line 550, in get_config_vars
_init_posix(_CONFIG_VARS)
File "$LOCAL_PYTHON/Lib/sysconfig.py", line 421, in _init_posix
_temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "$LOCAL_PYTHON/Lib/importlib/_bootstrap.py", line 953, in _find_and_load_unlocked
raise ModuleNotFoundError(_ERR_MSG.format(name), name=name)
ModuleNotFoundError: No module named '_sysconfigdata_m_linux_x86_64-linux-gnu'
如果我 运行 它没有冻结(例如 $LOCAL_PYTHON/python myapp.py
),我的应用程序工作正常,并且相同的冻结命令和应用程序在 Windows 上生成一个工作的可执行文件。是否缺少某些平台特定的冻结参数或环境变量?
所以我能够使用 docker 重现该问题。我运行一个docker容器使用下面
docker run -it fedora:27 bash
然后 运行 下面的命令从源
设置 pythonyum install -y git gcc unzip zip wget curl make cmake zlib-devel libsq3-devel readline-devel openssl-devel which vim findutils
mkdir py
cd py/
wget "https://github.com/python/cpython/archive/v3.6.5.zip"
unzip v3.6.5.zip
cd cpython-3.6.5/
./configure --with-debug
make -j8
之后我创建了一个简单的 app.py
print('this is from app')
然后我运行
export LANG=en_US.UTF-8
LOCAL_PYTHON=/py/cpython-3.6.5/
$LOCAL_PYTHON/python $LOCAL_PYTHON/Tools/freeze/freeze.py -p $LOCAL_PYTHON -P $LOCAL_PYTHON -o frozen app.py
cd frozen/
make
./app
我得到了以下异常
[root@54ba4757d177 frozen]# ./app
Failed to import the site module
Traceback (most recent call last):
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 955, in _find_and_load_unlocked
module = _load_unlocked(spec)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 665, in _load_unlocked
spec.loader.exec_module(module)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 807, in exec_module
exec(code, module.__dict__)
File "/py/cpython-3.6.5/Lib/site.py", line 544, in <module>
main()
File "/py/cpython-3.6.5/Lib/site.py", line 530, in main
known_paths = addusersitepackages(known_paths)
File "/py/cpython-3.6.5/Lib/site.py", line 282, in addusersitepackages
user_site = getusersitepackages()
File "/py/cpython-3.6.5/Lib/site.py", line 258, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "/py/cpython-3.6.5/Lib/site.py", line 248, in getuserbase
USER_BASE = get_config_var('userbase')
File "/py/cpython-3.6.5/Lib/sysconfig.py", line 601, in get_config_var
return get_config_vars().get(name)
File "/py/cpython-3.6.5/Lib/sysconfig.py", line 550, in get_config_vars
_init_posix(_CONFIG_VARS)
File "/py/cpython-3.6.5/Lib/sysconfig.py", line 421, in _init_posix
_temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 971, in _find_and_load
return _find_and_load_unlocked(name, import_)
File "/py/cpython-3.6.5/Lib/importlib/_bootstrap.py", line 953, in _find_and_load_unlocked
raise ModuleNotFoundError(_ERR_MSG.format(name), name=name)
ModuleNotFoundError: No module named '_sysconfigdata_m_linux_x86_64-linux-gnu'
和你一样。然后我运行make install
安装python再试
make install -C /py/cpython-3.6.5/
然后再次应用程序
[root@54ba4757d177 frozen]# ./app
this is from app
并且有效,所以我了解到问题是生成的应用程序假定 python 已安装在计算机上。然后我找到了
形式的黄金Python freeze.py generated bin doesn't run
我更新了 /py/cpython-3.6.5/Tools/freeze/makefreeze.py
文件并在 PyImport_FrozenModules = _PyImport_FrozenModules;
之前添加了 Py_NoSiteFlag = 1;
。
当然,我再次创建容器以确保系统上没有安装 python。然后再次重新编译应用程序,宾果游戏!
[root@06284cc1ae0c frozen]# ./app
this is from app
更进一步,我再次删除了所有 python 源、构建文件和 运行 应用程序,效果很好