Python 3.x 在Python2上创建RPM是可行的,但Python3由于sys.implementation.cache_标记而失败
我试图在SLES12 SP2上从Python应用程序创建RPM。这是我的setup.py文件:Python 3.x 在Python2上创建RPM是可行的,但Python3由于sys.implementation.cache_标记而失败,python-3.x,rpm,setuptools,distutils,Python 3.x,Rpm,Setuptools,Distutils,我试图在SLES12 SP2上从Python应用程序创建RPM。这是我的setup.py文件: import setuptools setuptools.setup(name='MyApp', version='1.2.3', options={'bdist_rpm': {'post_install': 'post_install.sh', 'po
import setuptools
setuptools.setup(name='MyApp',
version='1.2.3',
options={'bdist_rpm': {'post_install': 'post_install.sh',
'post_uninstall': 'post_uninstall.sh'}})
没什么特别的
运行python setup.py bdist\u rpm
可以工作。但是,运行python3 setup.py bdist_rpm
会执行以下操作:
running bdist_rpm
running egg_info
writing top-level names to MyApp.egg-info/top_level.txt
...
byte-compiling /home/pedro/MyApp/build/bdist.linux-x86_64/rpm/BUILDROOT/MyApp-1.2.3-1.x86_64/usr/lib/python3.4/site-packages/MyApp/my_file.py to my_file.cpython-34.pyc
...
Processing files: MyApp-1.2.3-1.noarch
error: File not found: /home/pedro/MyApp/build/bdist.linux-x86_64/rpm/BUILDROOT/MyApp-1.2.3-1.x86_64/usr/lib/python3.4/site-packages/MyApp/my_file.py
RPM build errors:
File not found: /home/pedro/MyApp/build/bdist.linux-x86_64/rpm/BUILDROOT/MyApp-1.2.3-1.x86_64/usr/lib/python3.4/site-packages/MyApp/my_file.py
error: command 'rpmbuild' failed with exit status 1
问题似乎是setuptools正在生成一个以.cpython-34.pyc
结尾的文件,然后查找一个没有.cpython-34
的文件,但找不到它
Python3上的RPM生成过程经过distutils.util.byte\u compile()
,然后从源(path)调用importlib.util.cache\u,其中path
是要进行字节编译的文件cache\u from\u source()
如下所示(缩写):
sys.implementation.cache_标记的值是'cpython-34'
。Python 2中不存在sys的这个属性。因此,在字节编译过程中,setuptools
似乎将此标记注入文件名,但后来忘记了它修改了文件名并失败了,因为它正在查找原始名称
我怎样才能:
在RPM生成期间禁用字节编译
禁止在字节编译中使用缓存标记,或
确保setuptools
(或rpmbuild
;不确定哪一个正在搜索原始文件名)在其搜索的文件名中保持一致
建议在spec文件中完全禁用字节编译,但我正在寻找一种方法,仅使用straightpython3 setup.py bdist_RPM生成RPM——可能是一些其他参数
命令
def cache_from_source(path, debug_override=None, *, optimization=None):
path = _os.fspath(path)
head, tail = _path_split(path)
base, sep, rest = tail.rpartition('.')
tag = sys.implementation.cache_tag
if tag is None:
raise NotImplementedError('sys.implementation.cache_tag is None')
almost_filename = ''.join([(base if base else rest), sep, tag])
optimization = str(optimization)
if optimization != '':
almost_filename = '{}.{}{}'.format(almost_filename, _OPT, optimization)
return _path_join(head, _PYCACHE, almost_filename + BYTECODE_SUFFIXES[0])