簡體   English   中英

嘗試在 setup.py 中指定的同一包中安裝 Python 擴展模塊 (Cython) 時出現 ModuleNotFound

[英]ModuleNotFound when trying to install Python Extension Module (Cython) inside the same package specified in setup.py

我有一個 Python 項目的 Cython 擴展模塊,我想安裝到與安裝項目相同的命名空間。 當我嘗試在擴展中指定將其安裝在包本身中時,無法找到並導入它。 如果我指定擴展名在 Python 命名空間的根目錄中,它可以正常工作,但它不在我想要的模塊命名空間中。 如何從與包本身相同的命名空間導入擴展模塊?

我為這個問題做了一個簡單的測試用例。

文件夾結構:

mypkg
├── foo
│   ├── __init__.py
│   └── barCy.pyx
└── setup.py

.barCy.pyx文件:

cpdef long bar():
    return 0

setup.py代碼:

import distutils.extension
from Cython.Build import cythonize

from setuptools import setup, find_packages

extensions = [distutils.extension.Extension("foo.bar",
                                            ['foo/barCy.pyx'])]
setup(
        name='foo',
        packages=find_packages(),
        ext_modules=cythonize(extensions),
        )

__init.py__是空的。

我希望能夠做到:

>>> import foo.bar as bar
>>> bar.bar()
0

相反,我得到

>>> import foo.bar as bar
ModuleNotFoundError: No module named 'foo.bar'

如果我將Extension("foo.bar",...更改為Extension("bar",... ,那么我可以像頂級包一樣import bar 。雖然這是預期的行為,但它是不是我想要的,因為我只希望可以通過foo命名空間訪問此擴展模塊。

我的 Python 解釋器是從與setup.py腳本相同的文件夾中運行的,因此執行import foo是導入本地包,而不是安裝在 Python 解釋器的site-packages目錄中site-packages 由於它們具有相同的文件夾結構,因此選擇本地目錄作為替代的導入包。

從與源不同的文件夾進行測試/運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM