我正在使用distutils从我的项目创建一个rpm。我有这个目录树:
project/
my_module/
data/file.dat
my_module1.py
my_module2.py
src/
header1.h
header2.h
ext_module1.cpp
ext_module2.cpp
swig_module.i
setup.py
MANIFEST.in
MANIFEST
我的setup.py
from distutils.core import setup, Extension
module1 = Extension('my_module._module',
sources=['src/ext_module1.cpp',
'src/ext_module2.cpp',
'src/swig_module.i'],
swig_opts=['-c++', '-py3'],
include_dirs=[...],
runtime_library_dirs=[...],
libraries=[...],
extra_compile_args=['-Wno-write-strings'])
setup( name = 'my_module',
version = '0.6',
author = 'microo8',
author_email = 'magyarvladimir@gmail.com',
description = '',
license = 'GPLv3',
url = '',
platforms = ['x86_64'],
ext_modules = [module1],
packages = ['my_module'],
package_dir = {'my_module': 'my_module'},
package_data = {'my_module': ['data/*.dat']} )
我的MANIFEST.in
文件:
include src/header1.h
include src/header2.h
python3 setup.py sdist
会自动生成MANIFEST
文件。当我运行python3 setup.py bdist_rpm
时,它会编译并创建正确的rpm包。但问题是,当我在C++源代码上运行SWIG时,它会创建一个包装二进制_module.cpython32-mu.so
文件的module.py
文件,该文件是用module_wrap.cpp
文件创建的,并且不会复制到my_module
目录。
我必须向setup.py
文件写入什么内容才能自动复制SWIG生成的python模块?
我还有另一个问题:当我安装rpm包时,我希望在/usr/bin
中创建一个可执行文件来运行应用程序(例如,如果my_module/my_module1.py
是应用程序的启动脚本,那么我可以在bash:$ my_module1
中运行)。
发布于 2014-01-20 22:08:09
问题是,在运行SWIG的build_ext
之前,build_py
(将python源代码复制到构建目录)出现了。
您可以轻松地子类化build命令并交换顺序,这样build_ext
就可以在build_py
尝试复制module1.py
之前生成它。
from distutils.command.build import build
class CustomBuild(build):
sub_commands = [
('build_ext', build.has_ext_modules),
('build_py', build.has_pure_modules),
('build_clib', build.has_c_libraries),
('build_scripts', build.has_scripts),
]
module1 = Extension('_module1', etc...)
setup(
cmdclass={'build': CustomBuild},
py_modules=['module1'],
ext_modules=[module1]
)
但是,这样做有一个问题:如果您使用的是setuptools,而不仅仅是普通的distutils,那么运行python setup.py install
将不会运行定制的构建命令。这是因为setuptools install命令实际上并不是先运行build命令,它先运行egg_info,然后运行install_lib,后者直接运行build_py和build_ext。
因此,可能更好的解决方案是将构建和安装命令都派生为子类,并确保在这两个命令的开头都运行build_ext。
from distutils.command.build import build
from setuptools.command.install import install
class CustomBuild(build):
def run(self):
self.run_command('build_ext')
build.run(self)
class CustomInstall(install):
def run(self):
self.run_command('build_ext')
self.do_egg_install()
setup(
cmdclass={'build': CustomBuild, 'install': CustomInstall},
py_modules=['module1'],
ext_modules=[module1]
)
看起来你不需要担心build_ext会运行两次。
发布于 2013-04-08 23:25:24
这不是一个完整的答案,因为我没有完整的解决方案。没有将该模块复制到安装目录的原因是,当安装过程尝试复制它时,该模块并不存在。事件的顺序是:
running install
running build
running build_py
file my_module.py (for module my_module) not found
file vcanmapper.py (for module vcanmapper) not found
running build_ext
如果你第二次运行python setup.py install
,它会做你第一次想要做的事情。Python的官方SWIG文档建议您首先运行swig
来生成包装文件,然后运行setup.py install
来进行实际安装。
发布于 2012-09-19 17:56:01
It looks like您必须添加一个py_modules
选项,例如:
setup(...,
ext_modules=[Extension('_foo', ['foo.i'],
swig_opts=['-modern', '-I../include'])],
py_modules=['foo'],
)
Using rpm to Install System Scripts in Linux,你必须修改你的规范文件。%files
部分告诉rpm
将文件放在哪里,您可以在%post
中移动或链接到这些文件,但在setup.py
中定义的can be使用:
options = {'bdist_rpm':{'post_install':'post_install', 'post_uninstall':'post_uninstall'}},
可以使用通常的第一行作为#!/usr/bin/python
,并使用chmod +x filename
在文件上执行Running Python scripts in Bash。
https://stackoverflow.com/questions/12491328
复制相似问题