该distutils
模块允许将资源文件与 Python 模块一起包含和安装。如果在构建过程中应该生成资源文件,如何正确包含它们?
例如,该项目是一个 Web 应用程序,其中包含应编译为 JavaScript 并包含在 Python 包中的 CoffeeScript 源代码。有没有办法将其集成到正常的 sdist/bdist 进程中?
该distutils
模块允许将资源文件与 Python 模块一起包含和安装。如果在构建过程中应该生成资源文件,如何正确包含它们?
例如,该项目是一个 Web 应用程序,其中包含应编译为 JavaScript 并包含在 Python 包中的 CoffeeScript 源代码。有没有办法将其集成到正常的 sdist/bdist 进程中?
我花了很长时间才弄清楚这一点,那里的各种建议以各种方式被破坏 - 它们破坏了依赖项的安装,或者它们在 pip 中不起作用等。这是我的解决方案:
在 setup.py 中:
from setuptools import setup, find_packages
from setuptools.command.install import install
from distutils.command.install import install as _install
class install_(install):
# inject your own code into this func as you see fit
def run(self):
ret = None
if self.old_and_unmanageable or self.single_version_externally_managed:
ret = _install.run(self)
else:
caller = sys._getframe(2)
caller_module = caller.f_globals.get('__name__','')
caller_name = caller.f_code.co_name
if caller_module != 'distutils.dist' or caller_name!='run_commands':
_install.run(self)
else:
self.do_egg_install()
# This is just an example, a post-install hook
# It's a nice way to get at your installed module though
import site
site.addsitedir(self.install_lib)
sys.path.insert(0, self.install_lib)
from mymodule import install_hooks
install_hooks.post_install()
return ret
然后,在调用 setup 函数时,传递 arg:
cmdclass={'install': install_}
您可以使用相同的想法进行构建而不是安装,为自己编写一个装饰器以使其更容易等。这已经通过 pip 进行了测试,并直接调用“python setup.py install”。
最好的方法是编写一个自定义的 build_coffeescript 命令并使其成为 build 的子命令。对类似/重复问题的其他答复中提供了更多详细信息,例如这个: