如何从setuptools将文件安装到site-packages(而不是package子文件夹)?

时间:2014-01-26 15:43:47

标签: python setuptools

一般问题: 在setuptools中是否有一种方法可以在前缀\ Lib \ site-packages目录中安装dll?

我的具体需求: PyQt5没有为Python2.7提供二进制安装程序,所以我是从源代码构建的,为了方便起见,我想打包结果。官方安装程序将sip.pyd放在前缀\ Lib \ site-packages中,我希望保持一致。但我不确定如何。看来我可以使用py_modules或ext_modules来定义我希望模块去的地方,但是我无法弄清楚如何使用.pyd文件来处理它们。

我很关心windows,但我如果有一个setuptools解决方案,它将与平台无关。如果重要,我正在尝试部署为轮(.whl)文件。

这就是我所拥有的:

from setuptools import setup, find_packages, Extension

setup(name='PyQt5',
      version='5.2',
      packages=find_packages(),
      package_data = {"PyQt5":["*.pyd","uic/widget-plugins/*.py"]},
      include_package_data=True,
      scripts=["sip.exe"],
      #ext_modules=[Extension("sip.pyd", ["sip.pyd"])], # <- this isn't working
      headers=["sip.h"],
      classifiers=[
        'Operating System :: Microsoft :: Windows',
        'License :: OSI Approved :: GNU General Public License (GPL)',
      ],
      )

我很清楚,这就是PyQt4安装程序包装的样子: PyQt4 installer structure

你可以看到,而不是放在$ _OUTDIR中,sip.pyd转到Lib \ site-packages。

1 个答案:

答案 0 :(得分:0)

不可否认,这是一次黑客行为,但它为我们完成了工作。我们有基于平台的不同共享对象,并且没有能够在所有平台上构建它们的奢侈品。所以我们将它们保存在git repo中的编译形式中。

在setup.py文件中调用setup(...)之后。

def copydir(source, dest):
    for fname in os.listdir(source):                                                                                                                                                             
        shutil.copy(os.path.join(source, fname), os.path.join(dest, fname))                                                                                                                      

if os.path.isfile('/etc/redhat-release') and platform.system() == "Linux":                                                                                                                       
    copydir('redhat', 'modname')                                                                                                                                                              
elif platform.system() == "Windows":                                                                                                                                                             
    copydir('windows', 'modname')                                                                                                                                                             
else:                                                                                                                                                                                            
    copydir('debian', 'modname')