Sympy autowrap (Cython) 失败,出现“致命错误 LNK1104:无法打开文件 'build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd''

如何解决Sympy autowrap (Cython) 失败,出现“致命错误 LNK1104:无法打开文件 'build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd''

系统:Windows 10
蟒蛇:3.8
同情:1.8

我有一个很大的 Sympy 矩阵 regressor,我需要将其转换为 C 代码(以加快以后使用此矩阵的计算)。我正在使用 Sympy 的自动包装来做到这一点:

self.cy = autowrap(self.regressor,backend='cython',args=tuple(self._get_state()),verbose=True,tempdir=self.__cython_path)

这已经工作了很长时间,直到我对矩阵进行了一些更改(这可能会增加其大小)。当我现在运行代码时,我收到以下错误消息,但我不知道如何解决这个问题:

Traceback (most recent call last):
  File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\sympy\core\cache.py",line 72,in wrapper
    retval = cfunc(*args,**kwargs)
TypeError: unhashable type: 'MutableDenseMatrix'

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\sympy\utilities\autowrap.py",line 167,in _process_files
    retoutput = check_output(command,stderr=STDOUT)
  File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\subprocess.py",line 411,in check_output
    return run(*popenargs,stdout=PIPE,timeout=timeout,check=True,File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\subprocess.py",line 512,in run
    raise CalledProcessError(retcode,process.args,subprocess.CalledProcessError: Command '['C:\\Users\\Jonas\\anaconda3\\envs\\robot-parameter-identification\\python.exe','setup.py','build_ext','--inplace']' returned non-zero exit status 1.

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "C:/Users/Jonas/Repo/robot-parameter-identification/optimize_trajectory.py",line 39,in <module>
    robot = dynamics.robot_constructor(r,identity)
  File "C:\Users\Jonas\Repo\robot-parameter-identification\identification\dynamics.py",line 473,in robot_constructor
    robot = Robot(robot_path,cython_path,parameters)
  File "C:\Users\Jonas\Repo\robot-parameter-identification\identification\dynamics.py",line 448,in __init__
    self.__get_regressor_objects(cython_path)
  File "C:\Users\Jonas\Repo\robot-parameter-identification\identification\dynamics.py",line 422,in __get_regressor_objects
    self.reduced_regressor_for_id = Reduced_Regressor(os.path.join(cython_path,'id'),full_regressor,state,File "C:\Users\Jonas\Repo\robot-parameter-identification\identification\dynamics.py",line 394,in __init__
    super().__init__(cython=True,cython_path=cython_path)
  File "C:\Users\Jonas\Repo\robot-parameter-identification\identification\dynamics.py",line 335,in __init__
    self._get_cy()
  File "C:\Users\Jonas\Repo\robot-parameter-identification\identification\dynamics.py",line 325,in _get_cy
    self.cy = autowrap(self.regressor,File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\sympy\core\cache.py",line 74,in wrapper
    retval = func(*args,**kwargs)
  File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\sympy\utilities\autowrap.py",line 646,in autowrap
    return code_wrapper.wrap_code(routine,helpers=helps)
  File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\sympy\utilities\autowrap.py",line 148,in wrap_code
    self._process_files(routine)
  File "C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\sympy\utilities\autowrap.py",line 169,in _process_files
    raise CodeWrapError(
sympy.utilities.autowrap.CodeWrapError: Error while executing command: C:\Users\Jonasstiegler\anaconda3\envs\robot-parameter-identification\python.exe setup.py build_ext --inplace. Command output is:
Compiling wrapper_module_0.pyx because it changed.
[1/1] Cythonizing wrapper_module_0.pyx
C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\Cython\Compiler\Main.py:369: FutureWarning: Cython directive 'language_level' not set,using 2 for Now (Py2). This will change in a later release! File: C:\Users\Jonas\Repo\robot-parameter-identification\AR1440_bugfix\regressor_files\id\wrapper_module_0.pyx
  tree = Parsing.p_module(s,pxd,full_module_name)
running build_ext
building 'wrapper_module_0' extension
creating build
creating build\temp.win-amd64-3.8
creating build\temp.win-amd64-3.8\Release
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\numpy\core\include -IC:\Users\Jonas\anaconda3\envs\robot-parameter-identification\include -IC:\Users\Jonas\anaconda3\envs\robot-parameter-identification\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include" "-IC:\Program Files (x86)\Windows Kits\NETFxsdk\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /Tcwrapper_module_0.c /Fobuild\temp.win-amd64-3.8\Release\wrapper_module_0.obj -std=c99
cl : Command line warning D9002 : ignoring unkNown option '-std=c99'
wrapper_module_0.c
C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\numpy\core\include\numpy\npy_1_7_deprecated_api.h(14) : Warning Msg: Using deprecated NumPy API,disable it with #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\Jonas\anaconda3\envs\robot-parameter-identification\lib\site-packages\numpy\core\include -IC:\Users\Jonas\anaconda3\envs\robot-parameter-identification\include -IC:\Users\Jonas\anaconda3\envs\robot-parameter-identification\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\include" "-IC:\Program Files (x86)\Windows Kits\NETFxsdk\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /Tcwrapped_code_0.c /Fobuild\temp.win-amd64-3.8\Release\wrapped_code_0.obj -std=c99
cl : Command line warning D9002 : ignoring unkNown option '-std=c99'
wrapped_code_0.c
creating C:\Users\Jonas\Repo\robot-parameter-identification\AR1440_bugfix\regressor_files\id\build\lib.win-amd64-3.8
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMbed,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\libs /LIBPATH:C:\Users\Jonas\anaconda3\envs\robot-parameter-identification\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFxsdk\4.8\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x64" /EXPORT:PyInit_wrapper_module_0 build\temp.win-amd64-3.8\Release\wrapper_module_0.obj build\temp.win-amd64-3.8\Release\wrapped_code_0.obj /OUT:build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.8\Release\wrapper_module_0.cp38-win_amd64.lib
   Creating library build\temp.win-amd64-3.8\Release\wrapper_module_0.cp38-win_amd64.lib and object build\temp.win-amd64-3.8\Release\wrapper_module_0.cp38-win_amd64.exp
Generating code
LINK : the 32-bit linker (C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX86\x64\link.exe) ran out of heap space and is going to restart linking with a 64-bit linker
LINK : restarting link with 64-bit linker `C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\HostX64\x64\link.exe'
LINK : Fatal error LNK1104: cannot open file 'build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd'
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.28.29910\\bin\\HostX86\\x64\\link.exe' Failed with exit status 1104

提前感谢您提供的所有提示。如果缺少任何需要的信息,如果有人要求,我会补充。

解决方法

在@DavidW 的帮助下,我找到了解决这个问题的方法,尽管它需要修改 Sympy 的源代码。

背景

Cython 总是首先尝试使用 32 位链接器。当它用完堆时,它将使用 64 位链接器重新启动转换。这里的问题是 64 位链接器最有可能无法访问的 .pyd 文件,因为它已经加载或可能仍由 32 位链接器打开,正如@ead 指出的那样。
通过如下修改代码,可以强制 Cython 从一开始就使用 64 位链接器,从而避免了这个问题。

解决方案

  1. 打开 Sympy 包中的 autowrap.py 文件
  2. 转到 class CythonCodeWrapper(第 218 行)
  3. 转到类声明正下方的 setup_template
  4. 在字符串的开头添加以下两行:
from distutils import _msvccompiler
_msvccompiler.PLAT_TO_VCVARS['win-amd64'] = 'amd64'

源代码现在应如下所示:

class CythonCodeWrapper(CodeWrapper):
    """Wrapper that uses Cython"""

    setup_template = """\
from distutils import _msvccompiler
_msvccompiler.PLAT_TO_VCVARS['win-amd64'] = 'amd64'  
try:
    from setuptools import setup
    from setuptools import Extension
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?