相关疑难解决方法(0)

如何将链接的DLL和pyd文件打包到一个自包含的pyd文件中?

我正在使用Cython构建一个链接DLL文件的python模块.为了成功导入我的模块,我需要在Windows搜索路径中使用DLL.否则,典型的错误消息是:

ImportError: DLL load failed: The specified module could not be found.

有没有办法将DLL直接打包到生成的pyd文件中以使分发更容易?

这方面的一个例子是OpenCV发行版,其中分发了(巨大的)pyd文件,并且是Python绑定工作所需的唯一文件.

python windows dll cython

16
推荐指数
1
解决办法
4086
查看次数

即使我的包包含已编译的库,轮名也是独立于平台的

我正在尝试为Windows生成特定于平台的二进制分发包,但会python setup.py bdist_wheel生成通用文件名.我需要在setup.py或其他方面更改以获得具有平台特定名称的轮子?从我收集的setuptools应该认识到什么时候包不会普遍,但这对我不起作用.

我正在开发的项目使用cmake和mingw w64编译了几个库的变体.这些编译库当然是32/64位特定的.为了创建单独的发行版,我为目标平台创建了一个virtualenv,我可以从中编译库.然后将编译好的库复制到python包中以进行轮转.

这是我的setup.py.pyfvs_files是要包含的已编译的'*.pyd'文件的列表.这会生成名为'pyfvs-0.0.1a0-py27-none-any.whl'的轮子,我希望它是'pyfvs-0.0.1a0-py27-none-win32.whl'和'pyfvs-0.0.1a0-py27 -none-win_amd64.whl".通过pip安装时,软件包的功能与目标平台的预期一致,但对于备用平台来说当然是失败的.最终,我想在Windows 32和64位以及linux 64位上支持Python 2.7,3.4,3.5.

import os
from glob import glob

from setuptools import setup
from setuptools.dist import Distribution

# TODO: Get the version from the git tag and or revision.
version = '0.0.1a0'

if os.name=='nt':
    so_ext = 'pyd'
else:
    so_ext = 'so'

pyfvs_files = glob('pyfvs/*.{}'.format(so_ext))
pyfvs_files.extend(['pyfvs/pyfvs.cfg',])

description = open('./README.txt').readline().strip()
long_desc = open('./README.txt').read().strip()

class BinaryDistribution(Distribution):
    def is_pure(self):
        return False

setup(
    name='pyfvs'
    , version=version
    , description=description
    , long_description=long_desc
    , url=''
    , author=""
    , author_email="" …
Run Code Online (Sandbox Code Playgroud)

python setuptools python-wheel

7
推荐指数
1
解决办法
856
查看次数

'pip setup.py bdist_wheel'不再构建强制非纯轮子

我有一个项目在Linux上使用C扩展编译,但在Windows上没有它们.当我第一次产生的车轮文件在Windows上python setup.py bdist_wheel,他们成为普遍的,我无法将它们上传到PyPI将这些万向轮被优先pip用于安装在.tar.gz上传(从结果python setup.py sdist).

围绕这个的诀窍是在setup.py:

Distribution.is_pure = lambda *args: False
Run Code Online (Sandbox Code Playgroud)

或通过子类化Distribution:

class BinaryDistribution(Distribution):
    def is_pure(self):
        return False
Run Code Online (Sandbox Code Playgroud)

setup()使用extra关键字参数在setup.py中 调用distclass=BinaryDistribution,.

这一切都在我的运行Windows XP 64的VM上运行良好,该版本具有32和64位版本的Python 2.6/2.7/3.3/3.4和pypy,仅用于此目的.一个简单的批处理文件给了我:

dist/pkg-1.0-cp26-none-win32.whl
dist/pkg-1.0-cp26-none-win_amd64.whl
dist/pkg-1.0-cp27-none-win32.whl
dist/pkg-1.0-cp27-none-win_amd64.whl
dist/pkg-1.0-cp33-none-win32.whl
dist/pkg-1.0-cp33-none-win_amd64.whl
dist/pkg-1.0-cp34-none-win32.whl
dist/pkg-1.0-cp34-none-win_amd64.whl
Run Code Online (Sandbox Code Playgroud)

pip当你pip在Windows上运行时,适当的软件包可以下载和安装,当你pip在Linux上运行时,你可以获得

pkg-1.0.tar.gz
Run Code Online (Sandbox Code Playgroud)

其中包括在安装过程中编译的C源代码.

问题始于我没有备用Windows 7许可的机器,我可以安装Python 3.5(它不安装在EOL XP上).所以我调查了Appveyor并创建了appveyor.yml:

environment:
  matrix:
    - PYTHON: C:\Python27
    - PYTHON: C:\Python33
    - PYTHON: C:\Python34
    - PYTHON: C:\Python35
    - PYTHON: …
Run Code Online (Sandbox Code Playgroud)

python windows pypi appveyor python-wheel

7
推荐指数
3
解决办法
4750
查看次数

标签 统计

python ×3

python-wheel ×2

windows ×2

appveyor ×1

cython ×1

dll ×1

pypi ×1

setuptools ×1