Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a .pyd file?

I'm creating a project that uses Python OpenCV. My image processing is a bit slow, so I thought I can made the code faster by creating a .pyd file (I read that somewhere).

I am able to create a .c file using Cython, but how to make a .pyd? While they are a kind of .dll, should I make a .dll first and convert it? And I think they're not platform-independent, what are equivalents on Unix?

Thanks for any help!

like image 236
linusg Avatar asked Apr 28 '16 17:04

linusg


2 Answers

Prerequisites
Cython
MinGW-w64 added to your PATH environment variable

You need to add a function called inityourfilename to your .py file Then have to make a .c file by

cython --embed yourfile.py

Then you need to compile it into a .o file using gcc replace the text after -I with the path to your Python include folder

If your MinGW is 64 bit then this command

gcc -mdll -O -Wall -IC:\\Users\\yourusername\\AppData\\Local\\Programs\\Python\\Python39\\include -c -DMS_WIN64 yourfile.c

If your MinGW is 32 bit remove the -DMS_WIN64 flag

To make the .pyd file from .o file

gcc -shared -LC:\\Users\\yourusername\\AppData\\Local\\Programs\\Python\\Python39\\libs yourfile.o -lpython39 -o yourfile.pyd   

Replace text after -L with path to your libs folder
Replace -lpython39 with your python version ie -lpython38 if you have python 3.8

Now check your .pyd file by importing it into another file

like image 89
Anonymous Avatar answered Oct 04 '22 08:10

Anonymous


You have to run a setup.py file in a terminal. This one is an example that uses numpy

try:
    from setuptools import setup
    from setuptools import Extension
except ImportError:
    from distutils.core import setup
    from distutils.extension import Extension

from Cython.Distutils import build_ext
import numpy as np

ext_modules = [Extension("my_code_cython",["my_code_cython.pyx"]),
               Extension("another_code_cython",["another_code_cython.pyx"])]

setup(
    name= 'Generic model class',
    cmdclass = {'build_ext': build_ext},
    include_dirs = [np.get_include()],
    ext_modules = ext_modules)

In the terminal (cmd in Windows) you have to execute the command

python setup.py build_ext --inplace

It is important that I suppose you have installed the compiler (Microsoft Visual C++ Compiler Package for Python 2.7 for example). You can find more information in https://github.com/cython/cython/wiki/CythonExtensionsOnWindows

like image 39
sebacastroh Avatar answered Oct 04 '22 09:10

sebacastroh