在尝试将pyx文件导入Jupyter时出现“ImportError: No module named ...”。

15

我在Jupyter笔记本的同一文件夹中有这个名为em.pyx的文件,我试图导入它,但是它给了我一个错误。

ImportError: No module named em
我尝试添加 <\p>
import sys
sys.path.insert(0, 'name_of_directory_where_pyxfile_is')
或者
sys.path.append('my/path/to/module/folder')
这里这里建议的那样尝试了,但我仍然得到相同的错误。我也创建了一个空的__init__.py文件,但没有用。
编辑:然后我添加了

import pyximport
pyximport.install()

import em之前,我没有遇到太多Python 2.7的错误(我不知道为什么是Python 2,因为pyx的编译是使用Python 3完成的,并且jupyter内核也设置为Python 3),现在我遇到了很多错误,其中前三个是:

ImportError                               Traceback (most recent call     last)
<ipython-input-2-778b3d13b1ae> in <module>()
  2 pyximport.install()
  3 
----> 4 import em1d

/home/me/.local/lib/python2.7/site-packages/pyximport/pyximport.pyc in     load_module(self, fullname)
460                                  self.pyxbuild_dir,
461                                  build_inplace=self.inplace,
--> 462                                      language_level=self.language_level)
463         return module
464 

/home/me/.local/lib/python2.7/site-packages/pyximport/pyximport.pyc in     load_module(name, pyxfilename, pyxbuild_dir, is_package, build_inplace,     language_level, so_path)
231                 raise exc.with_traceback(tb)
232             else:
--> 233                 exec("raise exc, None, tb", {'exc': exc, 'tb': tb})
234     return mod
235 

编辑2:此外,在运行pyximport.install()之后,我得到(None, None)


1
请查看我的答案:https://dev59.com/Ims05IYBdhLWcg3wAdST#69045480 对我来说,问题在于我没有编译设置,然后所有相关文件都需要在同一个目录中。 - tsveti_iko
1
似乎是Python版本的问题。你尝试过使用Python3创建一个虚拟环境吗? - ConsistentProgrammer
2个回答

0
据我所知,您无法直接导入Cython文件,因为它们可能不是有效的Python、C或C++代码。
您可以使用Cython将这些文件编译成已编译的C/C++代码。这将创建一个*.so文件(共享对象)。一旦拥有该文件,您可以像普通的Python模块一样导入它。
一种方法是使用setup.py文件来完成此操作:
from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize('em.pyx'))

然后你只需像这样执行脚本:python3 setup.py build_ext --inplace

这将在与您的安装文件相同的目录中创建一个可导入的em.cp3xx-win... .pyd / em.cpython-3x... .so文件(取决于您的操作系统)。它可以使用import em导入。(此外还会创建一个.c / .cpp文件)

这应该可以通过有效的pip install Cython安装来实现,但可能还需要C/C++编译器。

另一种方法是使用cythonize命令:

cythonize -i -a em.pyx

-a 告诉它同时创建一个 HTML 文件,其中包含带有彩色行的代码。颜色表示该特定行与 Python 的交互程度。通常,您希望减少着色以提高性能增益,但请注意,有些情况下 Python 更具性能(例如,据我所知,使用正则表达式)。

希望这可以帮助到您。


0
导入可能发生在您试图直接将.pyx文件导入Python时。您需要先安装Cython,这是pyxinstall的容器。这可能会有所帮助。
但是您可以尝试另一种方法。尝试将pyx文件转换为py文件,然后导入该文件。您的工作将完成,但将牺牲速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接