Python 3.x 在Python2上创建RPM是可行的,但Python3由于sys.implementation.cache_标记而失败

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

我试图在SLES12 SP2上从Python应用程序创建RPM。这是我的setup.py文件:

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文件中完全禁用字节编译,但我正在寻找一种方法,仅使用straight
    python3 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])