【问题标题】:Sympy autowrap (Cython) failing with 'fatal error LNK1104: cannot open file 'build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd''Sympy 自动换行(Cython)因“致命错误 LNK1104:无法打开文件 'build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd'”而失败
【发布时间】:2021-08-07 11:09:47
【问题描述】:

系统:Windows 10
Python:3.8
Sympy: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, backend='cython', args=tuple(self._get_state()), verbose=True,
  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

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

【问题讨论】:

  • 你改变了什么?尝试还原输入。如果它有效,这意味着您所做的更改与您正在尝试做的事情不兼容。如果它不起作用,则其他内容发生了变化。请包含示例数据。
  • stackoverflow.com/a/65206777/4657412 很可能基本上是同一个问题。我不完全确定你会如何将它应用到 sympy 中
  • @ewong 这是很多代码和开销,因此很难将其包含在此处。但是,使用较旧、较小的矩阵仍然有效。我怀疑以前 32 位链接器就足够了,但现在需要使用 64 位链接器重新启动,这就是问题所在。
  • @DavidW 感谢您的链接,我会试试看!
  • 在我看来,build\lib.win-amd64-3.8\wrapper_module_0.cp38-win_amd64.pyd 似乎无法访问。也许它已经被 32 位链接器版本加载或仍然打开。

标签: python windows visual-studio cython sympy


【解决方案1】:

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

背景

Cython 总是首先尝试使用 32 位链接器。当它用完堆时,它将使用 64 位链接器重新开始转换。这里的问题是.pyd 文件,64 位链接器很可能无法访问,因为它要么已经加载,要么可能仍由 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
...

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2011-04-02
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多