7

1つのパッケージに複数のPythonモジュールを集めたいので、Pythonパッケージとモジュールのグローバルセットからあまり多くの名前を予約しません。しかし、Cで書かれたモジュールに問題があります。

これは、Pythonの公式ドキュメントから直接引用した非常に簡単な例です。ここからページの下部にあります:http://docs.python.org/distutils/examples.html

from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
      version='1.0',
      ext_modules=[Extension('foopkg.foo', ['foo.c'])],
      )

私のfoo.cファイルは次のようになります

#include <Python.h>

static PyObject *
foo_bar(PyObject *self, PyObject *args);

static PyMethodDef FooMethods[] = {
    {
        "bar",
        foo_bar,
        METH_VARARGS,
        ""
    },
    {NULL, NULL, 0, NULL}
};

static PyObject *
foo_bar(PyObject *self, PyObject *args)
{
    return Py_BuildValue("s", "foobar");
}

PyMODINIT_FUNC
initfoo(void)
{
    (void)Py_InitModule("foo", FooMethods);
}

int
main(int argc, char *argv[])
{
    // Pass argv[0] to the Python interpreter
    Py_SetProgramName(argv[0]);

    // Initialize the Python interpreter.  Required.
    Py_Initialize();

    // Add a static module
    initfoo();

    return 0;
}

正常にビルドおよびインストールされますが、foopkg.fooをインポートできません。名前を「foo」に変更すると、完全に機能します。

「foopkg.foo」を機能させる方法はありますか?たとえば、Cコードの「foo」をPy_InitModule()から「foopkg.foo」に変更しても効果はありません。

4

2 に答える 2

6

__init__.pyフォルダ内にファイルが存在する必要がありfoopkgます。そうでない場合、Pythonはパッケージとして認識しません。

foopkgにフォルダを作成し、そこにsetup.py空のファイルを配置して、次の行を__init__.py追加します。packagessetup.py

from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
      version='1.0',
      packages=['foopkg'],
      ext_modules=[Extension('foopkg.foo', ['foo.c'])],
      )
于 2012-10-12T10:44:04.343 に答える
1

distutilspython 3.10以降、非推奨になりsetuptoolsます。代わりに、の拡張代替手段であるを使用できるため、で引数distutilsを渡す必要はありません。例えば ​​:packagessetup()

from setuptools import setup, Extension
setup(name='foobar',
      version='1.0',
      ext_modules=[Extension('foopkg.foo', ['foo.c'])],
      )

次に、C拡張機能をビルドしてインストールします

python /PATH/TO/setup.py install

C拡張機能を正常にビルドした後、次のコマンドを実行して、期待どおりにインポートできるかどうかをテストします。

python -c "from foopkg import foo"

[補足]もう1つsetuptool、C拡張パッケージをアンインストールするには、次のように実行するだけpip uninstallです。python -m pip uninstall foobar

于 2021-05-30T08:11:17.537 に答える