摆脱pyximport

6
我正在尝试使用Cython。与让pyximport执行此操作不同,我使用setup.py和build。然而,每次我导入我的模块时,似乎都会调用pyximport。pyximport无法构建,一切都崩溃了。
我使用Spyder。在我的项目中没有单个对pyximport的引用,但是Spyder似乎并不关心并继续调用pyximport。
我从命令窗口(在Spyder之外)调用我的程序,并且它运行得非常好。
我该如何摆脱对pyximport的调用?还是其他事情正在发生?
import c_result
Traceback (most recent call last):

  File "<ipython-input-2-3e92d1c50179>", line 1, in <module>
    import c_result

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyximport\pyximport.py", line 458, in load_module
language_level=self.language_level)

  File "C:\Users\xxxR\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyximport\pyximport.py", line 231, in load_module
raise exc.with_traceback(tb)

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyximport\pyximport.py", line 215, in load_module
inplace=build_inplace, language_level=language_level)

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyximport\pyximport.py", line 191, in build_module
reload_support=pyxargs.reload_support)

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\pyximport\pyxbuild.py", line 102, in pyx_to_dll
dist.run_commands()

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\Cython\Distutils\old_build_ext.py", line 185, in run
_build_ext.build_ext.run(self)

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\distutils\command\build_ext.py", line 339, in run
self.build_extensions()

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\Cython\Distutils\old_build_ext.py", line 192, in build_extensions
ext.sources = self.cython_sources(ext.sources, ext)

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\site-packages\Cython\Distutils\old_build_ext.py", line 327, in cython_sources
self.mkpath(os.path.dirname(target))

  File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\distutils\cmd.py", line 338, in mkpath
dir_util.mkpath(name, mode, dry_run=self.dry_run)

 File "C:\Users\xxx\AppData\Local\Continuum\Anaconda3\lib\distutils\dir_util.py", line 74, in mkpath
"could not create '%s': %s" % (head, exc.args[-1]))

ImportError: Building module c_result failed: ["distutils.errors.DistutilsFileError: could not create 'C:\\Windows\\system32\\config\\systemprofile': Kan ikke opprette en fil når filen allerede finnes\n"]

1
这是Spyder相对较新的添加(2017年初中期),因此该错误尚未“流行”。问题是由此处的代码引起的:https://github.com/spyder-ide/spyder/blob/master/spyder/utils/site/sitecustomize.py#L168。我唯一看到的解决方案是手动编辑您的Spyder安装中的sitecustomize.py文件,并删除if HAS_PYXIMPORT:下面的部分。 - Pierre de Buyl
ls 返回什么?(它由 IPython 解释,并将列出目录,就像常规的 shell 命令一样)。 - Pierre de Buyl
1
假设c_result.*.pyd在目录中,应该可以正确导入。Spyder会干扰sys.path,你能打印一下吗?import sys; print(sys.path) - Pierre de Buyl
1
我在sys.path变量中看到了对python36的引用。该模块是使用Python 3.5编译的。你能否使用正确的Python版本重新编译它? - Pierre de Buyl
1
嗯,那应该是相当不错的。Spyder使用Anaconda(从traceback中的路径可以看出)。使用C:\Users\ac22376.ONEADR\AppData\Local\Continuum\Anaconda3\bin\python3.6编译。我对Windows不够了解,无法推荐更高级的设置,就此告一段落。 - Pierre de Buyl
显示剩余9条评论
2个回答

7
问题出现在Spyder中,因为该软件包的初始化实际上会加载pyximport并调用pyximport.install(),这发生在utils/site/sitecustomize.py文件中。
其他人也在GitHub上抱怨了这个问题: 虽然不是很优雅的解决方法(例如在更新Spyder时无法维持),但可以手动编辑您的Spyder安装中的sitecustomize.py文件,并删除if HAS_PYXIMPORT:下面的部分。

1
Spyder维护者在此) 我们正在考虑如何解决这个问题,以适用于Spyder 3.2.5版本。我们决定后会发布答案。 - Carlos Cordoba
感谢您的评论!可能是一个可由用户编辑的设置? - Pierre de Buyl
是的,这正是我们考虑要做的。你认为哪个更直观:在“首选项> IPython控制台”中提供一个选项,还是在“运行>每个文件的配置”中提供一个选项来激活我们的Cython支持? - Carlos Cordoba
@CarlosCordoba 今天在Spyder中是否有可用的解决方案? - jvermeulen
@jvermeulen,没有。我们将在我们的3.2.8版本中解决这个问题。 - Carlos Cordoba

4

(Spyder维护者在此) 这个问题已经在我们的3.2.8版本中解决,该版本于2018年3月发布。


1
我仍然看到了错误,但是我的IPython控制台已经进入了一个糟糕的状态,导致导入出现问题。一旦我重新启动内核,一切都恢复正常了。 - Dustin Andrews

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