【问题标题】:Python package(s) install failure on packages that requires C source compiling (Visual Studio 2017)Python 包在需要 C 源代码编译的包上安装失败 (Visual Studio 2017)
【发布时间】:2018-02-15 06:03:13
【问题描述】:

在 Visual Studio 的 Python 中,我可以安装包,据我所知,它不需要 C 源编译。当涉及到需要编译的包时,它总是失败。我的安装尝试总是通过 Visual Studio 中的pip install package-name 完成。这是我尝试过的:

  • 安装 Visual Studio 2015 (VS 14.0) C/C++ 独立编译器
  • 编译安装后尝试重新安装包,还是失败
  • 重启机器,然后尝试重新安装包,还是失败

具体来说,我尝试安装RPIORPi.GPIO,或多或少会给出类似的错误消息:

error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

这是来自RPIO 安装尝试的完整日志:

----- Installing 'RPIO==0.10.0' -----
Collecting RPIO==0.10.0
  Using cached RPIO-0.10.0.tar.gz
Installing collected packages: RPIO
  Running setup.py install for RPIO: started
    Running setup.py install for RPIO: finished with status 'error'
    Complete output from command "C:\Program Files\Python36\python.exe" -u -c "import setuptools, tokenize;__file__='C:\\Users\\ELEMEN~1\\AppData\\Local\\Temp\\pip-build-4lvb_8wu\\RPIO\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\ELEMEN~1\AppData\Local\Temp\pip-oqz8bi8d-record\install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.6
    creating build\lib.win-amd64-3.6\RPIO
    copying source\RPIO\Exceptions.py -build\lib.win-amd64-3.6\RPIO
    copying source\RPIO\_RPIO.py -build\lib.win-amd64-3.6\RPIO
    copying source\RPIO\__init__.py -build\lib.win-amd64-3.6\RPIO
    creating build\lib.win-amd64-3.6\RPIO\PWM
    copying source\RPIO\PWM\__init__.py -build\lib.win-amd64-3.6\RPIO\PWM
    running build_ext
    building 'RPIO._GPIO' extension
    creating build\temp.win-amd64-3.6
    creating build\temp.win-amd64-3.6\Release
    creating build\temp.win-amd64-3.6\Release\source
    creating build\temp.win-amd64-3.6\Release\source\c_gpio
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD "-IC:\Program Files\Python36\include" "-IC:\Program Files\Python36\include" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\winrt" /Tcsource/c_gpio/py_gpio.c /Fobuild\temp.win-amd64-3.6\Release\source/c_gpio/py_gpio.obj
    py_gpio.c
    source/c_gpio/py_gpio.c(361): error C2373: 'setmode': redefinition; different type modifiers
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\ucrt\corecrt_io.h(528): note: see declaration of 'setmode'
    source/c_gpio/py_gpio.c(431): warning C4028: formal parameter 1 different from declaration
    source/c_gpio/py_gpio.c(431): warning C4028: formal parameter 2 different from declaration
    source/c_gpio/py_gpio.c(431): warning C4047: 'initializing': 'PyCFunction' differs in levels of indirection from 'int (__cdecl *)(int,int)'
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

    ----------------------------------------
Command ""C:\Program Files\Python36\python.exe" -u -c "import setuptools, tokenize;__file__='C:\\Users\\ELEMEN~1\\AppData\\Local\\Temp\\pip-build-4lvb_8wu\\RPIO\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\ELEMEN~1\AppData\Local\Temp\pip-oqz8bi8d-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\ELEMEN~1\AppData\Local\Temp\pip-build-4lvb_8wu\RPIO\
----- Failed to install 'RPIO==0.10.0' -----

所以我错过了什么?或者是软件包的来源缺少什么?

谢谢

【问题讨论】:

  • 你为 Visual Studio 安装了 Python 吗?
  • @AkshayKathpal 是的,当然。
  • 您是否查看了py_gpio.c 的源代码以进一步检查编译器错误消息所抱怨的内容?作者可能从未尝试在 Windows 上构建它。
  • 是的,这是个问题。出于某种原因,py_gpio.c 在编译时看到了两个相互冲突的 setmode() 声明——只有一个是正确的。这听起来不像是编译器版本问题,但对我来说更像是一个错误。在一个包含的标头中应该有一个函数声明。正如我所说,作者可能实际上并没有尝试在 Windows 上构建它,所以没有意识到这个问题。
  • 是的,这听起来可能是一种可能的解决方法,因为它是一个选项,我相信至少有几个其他免费的非 VC 编译器可用。除了要维护的工具链中的另一个工具的开销之外,可能没有什么缺点。

标签: python pip visual-studio-2017


【解决方案1】:

看起来py_gpio.c 正在重新定义 setmode(第 361 行,在第 431 行使用)。这是他们代码中的错误,因此您应该找到拥有它的团队并向他们报告。很可能他们添加它是为了支持旧版本的 MSVC,而不应该为当前版本添加它。

似乎代码使用的定义与 C 运行时的定义不同,如果变量类型不匹配,以后可能会导致问题。此处可能需要进行完整的代码审查。

无论如何,这似乎是 RPi.GPIO 软件包的问题,​​而不是您的安装或您正在使用的工具。

【讨论】:

    【解决方案2】:

    首先感谢@martineau提示问题

    这不是一个完整的解决方案,而是一些解决方法。

    1.使用其他 IDE/工具

    虽然该库仍与 Windows 工具链不兼容,但您可以尝试其他可能兼容的工具或 IDE。


    2。另一个图书馆

    这是我采取的解决方法。基本上,我需要 Python 库来访问 RPi GPIO,上述 RPi.GPIORPIO 不会安装在 Windows 版本上。 Python 的,所以我转移到另一个名为 gpiozero 的库。它与 Windows Python 兼容(它在 VS 中成功使用 pip-ed)并且到目前为止提供了我需要的功能。

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2019-09-05
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多