在.py脚本中导入.pyd文件(使用Cython创建)



我使用这里的示例代码(https://stackoverflow.com/a/36946412/8729576)从helloWorld.py脚本创建了一个简单的.pyd文件,尽管它确实生成了.pyd文件(以及一个构建文件夹helloWorld.c文件)-它抛出了一个错误[importterror: dynamic module does not define module export function (PyInit_helloWorld)]当我尝试导入在原始helloWorld.py中定义的名为printHW的函数时,使用正常的导入语法:

from helloWorld import printHW
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_helloWorld)

helloWorld.py

import time
def printHW():
print("Hello World - today's date is %s"%time.strftime('%Y-%m-%d',time.localtime()))
if '__name__' == '__main__':
printHW()

py

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
ext_modules = [Extension("helloWorld",["helloWorld.py"]) ]
for e in ext_modules:
e.cython_directives = {'language_level' : '3'}
setup(
name= 'helloWorld',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules)

,然后在命令提示符中输入:

python setup.py build_ext --inplace

我以前从未使用过Cython,所以真的不确定我在这里做错了什么,大多数so的答案都是特定的,而不是我想要理解的(用这个基本的例子)。

对于遇到此错误的任何人-它与输出文件的名称有关。使用输出pyd文件的名称和setup.py <[Extension("ThisShallBeYourModuleImportName",["helloWorld.py"])]>行我能够解决我的问题(感谢@DavidW)。注意,无论您在Extensions列表中为.py脚本提供什么名称,它都是您必须导入的名称,它是区分大小写的。此外,要导入编译后的.pyd文件ThisShallBeYourModuleImportName.cp36-win_amd64。你所需要的就是在你的python脚本中导入ThisShallBeYourModuleImportName,它就会导入模块,另外你可以删除。cp36-win_amd64,它仍然会被成功导入。尝试用以下更改构建上面的setup.py代码,以观察我所说的内容:

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
ext_modules = [Extension("jAckSparroW",["helloWorld.py"]) ]
for e in ext_modules:
e.cython_directives = {'language_level' : '3'}
setup(
name= 'WhatEver',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules)

现在打开终端并尝试

import jacksparrow
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'jacksparrow'
import jAckSparroW
>>>

相关内容

  • 没有找到相关文章

最新更新