【问题标题】:Cmake seems not to use the Python interpreter it confirms it usesCmake 似乎没有使用它确认使用的 Python 解释器
【发布时间】:2018-07-30 20:20:28
【问题描述】:

我有以下 CMakeLists.txt 文件,指示使用 Python 4.4

cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../cmake/")

project(aConfigd VERSION 1.0)
string(TOLOWER aConfigd project_id)

find_package(PythonInterp 3.4 REQUIRED)

include(FindPythonInterp)
set(PYTHON ${PYTHON_EXECUTABLE})
message(STATUS "\${PYTHON_EXECUTABLE} == ${PYTHON_EXECUTABLE}")
set(pkgdatadir /usr/share/configd)
set(configdir /etc/amy)
set(SONARCONFIGID_SOURCE_DIR etc/configd)
set(SRC_DIR configd/src/)

include(common)
#        "${SRC_DIR}/systemd_client.py"
#        "${SRC_DIR}/amyconfig_service.py"
        "${SRC_DIR}/__init__.py"
        "${SRC_DIR}/main.py"
        "${SRC_DIR}/application.py"
        DESTINATION ${pkgdatadir}/configd/
)

#general
set(CPACK_PACKAGE_NAME "a-config")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "a-config-manager")
set(CPACK_PACKAGE_DESCRIPTION "a-config-manager")

# redhat
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION 
      /etc/amy
      )

include(cpack)

确实,它确认了${PYTHON_EXECUTABLE} == /usr/bin/python3.4(见下面的第 4 行):

$ make clean ; cmake -DCMAKE_BUILD_TYPE=Release -DSHORT_VERSION=NO -DCUSTOMER=NO .. ;  make -j12 ; make package
-- Found PythonInterp: /usr/bin/python3.4 (found suitable version "3.4.5", minimum required is "3.4") 
-- Found PythonInterp: /usr/bin/python3.4 (found version "3.4.5") 
-- ${PYTHON_EXECUTABLE} == /usr/bin/python3.4
-- Build Type: Release
-- Detected distribution: rhel fedora
-- Detected aConfigd version: 2.3.0-3030-gf7733cf659
-- Detected distribution: rhel fedora
-- Configuring done
-- Generating done
-- Build files have been written to: /local/raid0/git/amy/aConfig/build
Run CPack packaging tool...
CPack: Create package using RPM
CPack: Install projects
CPack: - Run preinstall target for: aConfigd
CPack: - Install project: aConfigd
CPack: Create package
CPackRPM:Warning: CPACK_SET_DESTDIR is set (=ON) while requesting a relocatable package (CPACK_RPM_PACKAGE_RELOCATABLE is set): this is not supported, the package won't be relocatable.
CPackRPM: Will use GENERATED spec file: /local/raid0/git/my/aConfig/build/_CPack_Packages/Linux/RPM/SPECS/a-config.spec
CPack: - package: /local/raid0/git/my/aConfig/build/a-config-2.3.0-3030-gf7733cf659.el7.my.x86_64.rpm generated.
$ 

但是,如果我取消注释 "${SRC_DIR}/systemd_client.py" 行,我会收到错误:

Compiling /local/raid0/git/my/aConfig/build/_CPack_Packages/Linux/RPM/a-config-2.3.0-3030-gf7733cf659.el7.my.x86_64/usr/share/configd/configd/systemd_client.py ...
  File "/usr/share/configd/configd/systemd_client.py", line 21
    def __init__(self, systemd_proxy:Gio.DBusProxy):
                                    ^
SyntaxError: invalid syntax

def __init__(self, systemd_proxy:Gio.DBusProxy): a valid Python 3.4 不是语法吗?
如果是,为什么 Cmake 会抱怨?

【问题讨论】:

    标签: python python-3.x cmake rpm cpack


    【解决方案1】:

    根本原因出现在 rpmbuild 步骤中。
    RPM 试图提供额外的帮助,并尝试(字节码)编译它遇到的 .py 文件。
    唉,它错误地使用 python2 解释器来创建文件的字节码(即使在 CMakeLists.txt 文件中声明了find_package(PythonInterp 3.4 REQUIRED))。

    对我有用的解决方法是:

    set(CPACK_RPM_BUILDREQUIRES python34-devel)
    set(CPACK_RPM_SPEC_MORE_DEFINE "%define __python ${PYTHON_EXECUTABLE}")
    

    【讨论】:

      【解决方案2】:

      当您只运行"${SRC_DIR}/systemd_client.py" 时,您是在告诉它以与shell 运行相同的方式运行该脚本:查看#! 行并使用那里指定的任何解释器运行它。这可能类似于#! /usr/bin/python#! /usr/bin/env python

      如果您想使用特定的解释器运行脚本,则必须运行该解释器并将脚本传递给它——就像在 shell 中一样。我对 CMake 很生疏,但我假设你会这样做:

      "${PYTHON_EXECUTABLE}" "${SRC_DIR}/amyconfig_service.py"
      

      或者,由于这是您的代码,也许您想使用 setuptools 以编程方式为您的入口点生成脚本,这意味着它将为它们创建一个 #! 行,以运行用于运行的任何 Python 版本setup.py.

      【讨论】:

      • 感谢您的回答,@abarnert。但是,似乎根本原因在于其他地方:请参阅我的回答:stackoverflow.com/a/51622146/1656850
      • 关于setuptools:setuptools 擅长构建进入 PYTHON_PATH 的分隔 Python 模块,而不是安装系统范围的配置以配合独立应用程序。 (而且它对构建时配置没有多大帮助)。虽然大多数 Python 程序在外部依赖方面都很简单,但这个增加了一些零碎的东西,因此,我们应该使用构建工具来确保根据我们构建的平台将所有这些都放在正确的位置。跨度>
      • @boardrider setuptools 是您安装 ipython、modernize、scrapy、pylint、black 和各种其他脚本(包括 pip 本身)的方式。即使您的最终目标是构建一个独立程序(例如,使用 Windows 安装程序包、macOS .dmg 等),大多数用于执行此操作的工具都基于 setuptools
      • @boardrider 使用setuptools,我只需给它我的入口点,它就会自动创建我的脚本——为用户设置适当的 shbang 行,并且以某种方式它可以在 Windows 和 *nix 上运行——并找出将它们放在哪里,以便最终出现在用户的 PATH 等等,所以他们所要做的就是 pip install spam(或者,更好的是 python3 -m pip install spam) 和现在他们可以运行spamify。'
      • 相关应用程序需要在 Python 目录树之外创建配置文件(例如,/usr/share、/usr/lib/systemd/system、/etc/dbus-1/system.d /、/usr/share/dbus-1/system-services、/etc、/usr/bin 等)
      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多