Veggie
Veggie

Reputation: 407

What is the proper way to construct a Python package/module referencing a .PYD?

I am a rookie to the Python world, and now I find myself trying to learn how to properly create a Python package or module. I also have several requirements that must be met.

I have a core native DLL (we'll name it MyCore.dll) compiled from C++. This DLL must be deployed to a particular install location, as it's a core component of a product (we'll say ProgramFiles\MyProduct).

I have used SWIG to generate Python bindings for MyCore.dll. It has generated 2 files: _MyCoreBindings.pyd (essentially a DLL that references MyCore.dll) and MyCoreBindings.py (which loads _MyCoreBindings.pyd and provides a Python API to it).

Finally, I have a Python script (MyProduct.py) containing only an import, as my product must be imported in Python under the name MyProduct.SDK :

import MyCoreBindings as SDK

Thus, I want a user's Python script to be able to access it like so:

import MyProduct.SDK

File summary in order of dependency:

I've also read that the format of a Python package involves some directory structure mimicking the import path, and the possible inclusion of setup.py and __init__.py, but all materials I've read have not made it clear what must go in each of these files, and in what cases they are required. I am definitely not clear where this directory structure may be placed.

Upvotes: 3

Views: 1820

Answers (1)

Mike Driscoll
Mike Driscoll

Reputation: 33071

If you want Python to be able to import your module, then you have a couple of choices:

  • install the module to Python's site-packages folder.
  • modify the paths that Python searches for modules/packages to import. You can do that via a *.pth file or by modifying the path using Python's sys module (i.e. sys.path.append(/some/path) )

You use setup.py for installing your package and/or creating eggs/wheels etc. See the following for helpful hints:

You can create a package by using _init__.py inside a folder alongside your modules:

- MyProduct
  - __init__.py
  - MyCoreBindings.py
  - _MyCoreBindings.pyd

The _init__.py file can be empty. This basically allows you to import the folder as MyProduct:

import MyProduct

MyProduct.MyCoreBindings

or

from MyProduct import MyCoreBindings as SDK

You won't need a MyProduct.py if you go with the __init__.py in the root folder. I hope that all made sense.

Upvotes: 2

Related Questions