Вопрос

Как скомпилировать модуль C-Python, чтобы он был локальным для другого?Например.если у меня есть модуль с именем «bar» и еще один модуль с именем «mymodule», как мне скомпилировать «bar», чтобы он импортировался через «import mymodule.bar»?

(Извините, если это неправильно сформулировано, я не был уверен, какой термин подходит для этого.)

Я попробовал в setup.py следующее, но, похоже, это не работает:

from distutils.core import setup, Extension

setup(name='mymodule',
      version='1.0',
      author='Me',
      ext_modules=[Extension('mymodule', ['mymodule-module.c']),
                   Extension('bar', ['bar-module.c'])])

Редактировать

Спасибо, Алекс.Итак, вот что я в итоге использовал:

from distutils.core import setup, Extension

PACKAGE_NAME = 'mymodule'

setup(name=PACKAGE_NAME,
      version='1.0',
      author='Me',
      packages=[PACKAGE_NAME],
      ext_package=PACKAGE_NAME
      ext_modules=[Extension('foo', ['mymodule-foo-module.c']),
                   Extension('bar', ['mymodule-bar-module.c'])])

и, конечно же, папка с именем «mymodule», содержащая __init__.py.

Это было полезно?

Решение

Инструкции здесь:

Extension ('foo', ['src/foo1.c', 'src/foo2.c'])

описывает расширение, которое живет в корневом пакете, в то время как

Extension ('pkg.foo', ['src/foo1.c', 'src/foo2.c'])

Описывает то же расширение в пакете PKG.Исходные файлы и полученный объектный код идентичны в обоих случаях;Единственная разница заключается в том, где в файловой системе (и, следовательно, где в иерархии пространства имен Python) результирующее расширение живет.

Помните, что пакет — это всегда каталог (или zip-файл), содержащий модуль. __init__.Чтобы создать модуль, являющийся телом пакета, этот модуль будет называться __init__ и жить в каталоге пакета (или zip-файле).Я никогда не делал этого на C;если не получается сделать это напрямую, назовите модуль, например _init вместо этого и в __init__.py делать from _init import * (одно из очень немногих законных применений from ... import *;-).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top