如何解决Debian 12与Automake的Python模块安装目录冲突问题
解决Debian 12中Automake与dh_python3的Python路径冲突问题
问题背景
将原Ubuntu 16.04的软件包迁移到Debian 12时,遇到Python模块路径不兼容问题:
- Debian 10(Python2.7)依赖distutils,模块默认安装到
/usr/lib/pythonX.X/dist-packages - Debian 12(Python3.11)采用sysconfig替代已弃用的distutils,但Automake使用
posix_prefix方案会将模块安装到/usr/lib/python3.11/site-packages,而dh_python3和Python的sys.path都期望模块在/usr/lib/python3/dist-packages,导致构建报错(lintian提示路径错误)且模块无法被加载。
构建报错关键信息
W: python-rtfcomp: python-module-in-wrong-location usr/lib/python3.11/site-packages/pyrtfcomp.so -> usr/lib/python3/dist-packages/pyrtfcomp.so
解决方案
方案1:修改Automake路径检测逻辑,强制返回dist-packages路径
修改configure.ac中获取pythondir和pyexecdir的代码,直接生成符合Debian规范的路径,同时避开distutils的弃用警告:
AC_CACHE_CHECK([for $am_display_PYTHON script directory (pythondir)], [am_cv_python_pythondir], [if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " import sysconfig # 构建Debian标准的dist-packages路径 prefix = '$am_py_prefix' py_version = sysconfig.get_config_var('VERSION') sitedir = f'{prefix}/lib/python{py_version}/dist-packages' sys.stdout.write(sitedir)"` ])
对于回退到distutils的分支,添加警告抑制:
else: import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"`
方案2:通过debian/rules让dh_python3自动修正路径
如果不想修改Automake配置,可在debian/rules中添加规则,让dh_python3自动将模块从site-packages移动到dist-packages:
override_dh_python3: dh_python3 --sourcedir=debian/tmp/usr/lib/python3.11/site-packages
或者通用写法(自动匹配当前Python版本):
override_dh_python3: dh_python3 --sourcedir=debian/tmp/usr/lib/python$(shell python3 -c "import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}')")/site-packages
方案3:修正Automake的sysconfig scheme选择逻辑
避免强制切换到posix_prefix,改用Debian默认的scheme并调整参数,确保返回dist-packages路径:
am_cv_python_pythondir=`$PYTHON -c " import sysconfig if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() # 使用默认scheme并指定base为/usr,避免posix_prefix带来的site-packages路径 sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix', 'userbase':'$am_py_prefix'}) # 替换site-packages为dist-packages确保符合Debian规范 if 'site-packages' in sitedir: sitedir = sitedir.replace('site-packages', 'dist-packages') sys.stdout.write(sitedir)"`
验证步骤
- 若修改了
configure.ac,运行autoreconf -i更新配置 - 构建deb包:
dpkg-buildpackage -us -uc - 检查lintian输出,确认路径警告消失
- 安装包后验证模块可正常导入:
python3 -c "import pyrtfcomp"
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

