当前位置: 首页 > news >正文

自己做电影网站需要的成本网络营销推广方案范文

自己做电影网站需要的成本,网络营销推广方案范文,天津 工程 信息,贵阳网站建设公司CMake 学习笔记(访问Python) 利用Python可以做很多事情。比如: 利用 Python 自动生成一些代码。 在我们的程序中植入一个 Python 解释器。 为了做这些事情。就需要 CMake 能够知道 python 装在哪里,装的是什么版本的 python&a…

CMake 学习笔记(访问Python)

利用Python可以做很多事情。比如:

  1. 利用 Python 自动生成一些代码。

  2. 在我们的程序中植入一个 Python 解释器。

为了做这些事情。就需要 CMake 能够知道 python 装在哪里,装的是什么版本的 python,装了哪些包。是否安装了Python 相关的库。

下面就依次介绍如何实现这些功能。最核心的知识就是学会如何使用 find_package( ) 命令。

检测 Python 解释器

下面是个简单的例子。

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-01 LANGUAGES NONE)
find_package(PythonInterp REQUIRED)
execute_process(COMMAND${PYTHON_EXECUTABLE} "-c" "print('Hello, world!')"RESULT_VARIABLE _statusOUTPUT_VARIABLE _hello_worldERROR_QUIETOUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "RESULT_VARIABLE is: ${_status}")
message(STATUS "OUTPUT_VARIABLE is: ${_hello_world}")# compare the "manual" messages with the following handy helper
include(CMakePrintHelpers)
cmake_print_variables(_status _hello_world)

上面的代码最核心的有两句。find_package 用来查找 python。

find_package(PythonInterp REQUIRED)

如果需要指定 python 版本。可以像下面这样,下面的代码要求Python 版本不低于 3.5:

find_package(PythonInterp 3.5 REQUIRED)

如果要求Python 版本必须是某一个特定版本。可以像下面这样写:

find_package(PythonLibs 3.11.5 EXACT REQUIRED)

上面的代码要求python 的版本必须是3.11.5。find_package() 执行完后会自动生成一系列的变量,我们可以在后面的代码中使用这些变量。

  • PYTHONINTERP_FOUND, 布尔变量,记录是否找到 python 解释器
  • PYTHON_EXECUTABLE, python 解释器的路径
  • PYTHON_VERSION_STRING, python 的版本
  • PYTHON_VERSION_MAJOR, python 的主版本号
  • PYTHON_VERSION_MINOR, python 的副版本号
  • PYTHON_VERSION_PATCH, python 的版本修订号

另外需要掌握的是 execute_process()。 用这个命令可以调用 python ,执行一段特殊的程序。通常我们是利用 python 生成一段源代码。之所以用 python 生成代码。是因为可以利用 python 对当前系统做很多探测,根据系统的情况生成最适合的代码。或者我们的代码里有很多重复的地方。用python可以快速生成这些重复的代码。

总之,用上面的类似的方法,我们可以调用任意一段 python 程序,做我们想做的任意事情。

如果python 安装到了 cmake 无法自动检测到的位置,我们可以通过命令行告诉cmake 去哪里找 python:

cmake -D PYTHON_EXECUTABLE=/custom/location/python

检测 Python 库

第二种使用 python 的方法是在我们的程序中直接调用 python 。下面是一个简单的程序:

#include <Python.h>
int main(int argc, char *argv[]) 
{Py_SetProgramName(argv[0]); /* optional but recommended */Py_Initialize();PyRun_SimpleString("from time import time,ctime\n""print 'Today is',ctime(time())\n");Py_Finalize();return 0;
}

我们要编译这个程序。

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-02 LANGUAGES C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_C_STANDARD_REQUIRED ON)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED)
add_executable(hello-embedded-python hello-embedded-python.c)target_include_directories(hello-embedded-python
PRIVATE
${PYTHON_INCLUDE_DIRS}
)target_link_libraries(hello-embedded-python
PRIVATE
${PYTHON_LIBRARIES}
)

在我的电脑上运行的结果是这样的:

Could not find platform independent libraries <prefix>
Today is Tue May  7 08:51:16 2024

第一行是因为我没有设置环境变量,这个程序找不到我电脑里的python。但是这个并不影响程序运行。

检测 Python 包

下面是个更复杂的代码。里面调用了 Python 的包。为了能编译运行这个代码,需要cmake 检测我们的 python 是否安装了对应的包。

/** Code example from:*    https://docs.python.org/3.5/extending/embedding.html#pure-embedding*/#include <Python.h>int main(int argc, char *argv[]) {PyObject *pName, *pModule, *pDict, *pFunc;PyObject *pArgs, *pValue;int i;if (argc < 3) {fprintf(stderr, "Usage: pure-embedding pythonfile funcname [args]\n");return 1;}Py_Initialize();PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append(\".\")");pName = PyUnicode_DecodeFSDefault(argv[1]);/* Error checking of pName left out */pModule = PyImport_Import(pName);Py_DECREF(pName);if (pModule != NULL) {pFunc = PyObject_GetAttrString(pModule, argv[2]);/* pFunc is a new reference */if (pFunc && PyCallable_Check(pFunc)) {pArgs = PyTuple_New(argc - 3);for (i = 0; i < argc - 3; ++i) {pValue = PyLong_FromLong(atoi(argv[i + 3]));if (!pValue) {Py_DECREF(pArgs);Py_DECREF(pModule);fprintf(stderr, "Cannot convert argument\n");return 1;}/* pValue reference stolen here: */PyTuple_SetItem(pArgs, i, pValue);}pValue = PyObject_CallObject(pFunc, pArgs);Py_DECREF(pArgs);if (pValue != NULL) {printf("Result of call: %ld\n", PyLong_AsLong(pValue));Py_DECREF(pValue);} else {Py_DECREF(pFunc);Py_DECREF(pModule);PyErr_Print();fprintf(stderr, "Call failed\n");return 1;}} else {if (PyErr_Occurred())PyErr_Print();fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);}Py_XDECREF(pFunc);Py_DECREF(pModule);} else {PyErr_Print();fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);return 1;}Py_Finalize();return 0;
}

我们的这个程序还要调用一段 python 代码:

import numpy as np
def print_ones(rows, cols):
A = np.ones(shape=(rows, cols), dtype=float)
print(A)
# we return the number of elements to verify
# that the C++ code is able to receive return values
num_elements = rows*cols
return(num_elements)

cmake 文件前部分还是一样的:

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-03 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED)

后面的部分就不同了。首先要检测有没有安装 numpy:


# Find NumPy location
execute_process(COMMAND${PYTHON_EXECUTABLE} "-c" "import re, numpy; print(re.compile('/__init__.py.*').sub('',numpy.__file__))"RESULT_VARIABLE _numpy_statusOUTPUT_VARIABLE _numpy_locationERROR_QUIETOUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT _numpy_status)set(NumPy ${_numpy_location} CACHE STRING "Location of NumPy")
endif()# Find NumPy version
execute_process(COMMAND${PYTHON_EXECUTABLE} "-c" "import numpy; print(numpy.__version__)"OUTPUT_VARIABLE _numpy_versionERROR_QUIETOUTPUT_STRIP_TRAILING_WHITESPACE)include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NumPyFOUND_VAR NumPy_FOUNDREQUIRED_VARS NumPyVERSION_VAR _numpy_version)

这一段代码主要有2部分组成。首先是判断有没有安装 numpy,代码如下。

execute_process(COMMAND${PYTHON_EXECUTABLE} "-c" "import re, numpy; print(re.compile('/__init__.py.*').sub('',numpy.__file__))"RESULT_VARIABLE _numpy_statusOUTPUT_VARIABLE _numpy_locationERROR_QUIETOUTPUT_STRIP_TRAILING_WHITESPACE)if(NOT _numpy_status)set(NumPy ${_numpy_location} CACHE STRING "Location of NumPy")
endif()

如果找到了numpy, _numpy_status = 0。 所以后面的判断条件是 if(NOT _numpy_status) 。

找到 numpy 后,将numpy 的位置保存到一个变量 NumPy 中,并且这个 变量是 CACHE 的,也就是后面用户可以自己编辑这个变量的值。

然后是检测 numpy 的版本:

# Find NumPy version
execute_process(COMMAND${PYTHON_EXECUTABLE} "-c" "import numpy; print(numpy.__version__)"OUTPUT_VARIABLE _numpy_versionERROR_QUIETOUTPUT_STRIP_TRAILING_WHITESPACE)

版本号保存到 _numpy_version 这个变量中。然后用 FindPackageHandleStandardArgs 这个包的功能设置 NumPy_FOUND 变量。这里使用FindPackageHandleStandardArgs 的目的其实只有一个,就是当 NumPy 没找到时,cmake 可以抱错并停下来。

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NumPy
FOUND_VAR NumPy_FOUND
REQUIRED_VARS NumPy
VERSION_VAR _numpy_version
)

后面如何编译exe文件,这里也用了些技巧,比如用到了 PYTHON_VERSION_MAJOR:

add_executable(pure-embedding "")
target_sources(pure-embedding
PRIVATE
Py${PYTHON_VERSION_MAJOR}-pure-embedding.cpp
)
target_include_directories(pure-embedding
PRIVATE
${PYTHON_INCLUDE_DIRS}
)
target_link_libraries(pure-embedding
PRIVATE
${PYTHON_LIBRARIES}
)

还有最后一部分,我们要把 use_numpy.py 文件拷贝到 exe 所在目录,因为我们的程序要调用这个文件:


add_custom_command(OUTPUT${CMAKE_CURRENT_BINARY_DIR}/use_numpy.pyCOMMAND${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py${CMAKE_CURRENT_BINARY_DIR}/use_numpy.pyDEPENDS${CMAKE_CURRENT_SOURCE_DIR}/use_numpy.py)# make sure building pure-embedding triggers the above
# custom command
target_sources(pure-embeddingPRIVATE${CMAKE_CURRENT_BINARY_DIR}/use_numpy.py)

编译生成 pure-embedding.exe 后可以试着运行一下。

./pure-embedding use_numpy print_ones 2 3

结果如下:

[[1. 1. 1.]
[1. 1. 1.]]
Result of call: 6

文章转载自:
http://dinncopostconsonantal.tqpr.cn
http://dinncorundown.tqpr.cn
http://dinncolovesickness.tqpr.cn
http://dinncomccarthyite.tqpr.cn
http://dinncotanbark.tqpr.cn
http://dinncotyphomalarial.tqpr.cn
http://dinncosinfully.tqpr.cn
http://dinncobenthonic.tqpr.cn
http://dinnconeedlepoint.tqpr.cn
http://dinncosnakelike.tqpr.cn
http://dinncocerumen.tqpr.cn
http://dinncomauger.tqpr.cn
http://dinncotsun.tqpr.cn
http://dinncopycnometer.tqpr.cn
http://dinncomil.tqpr.cn
http://dinncootohemineurasthenia.tqpr.cn
http://dinncongwane.tqpr.cn
http://dinncohaversack.tqpr.cn
http://dinncorhenium.tqpr.cn
http://dinncopantomimist.tqpr.cn
http://dinncotowards.tqpr.cn
http://dinncocommix.tqpr.cn
http://dinncosubstitutive.tqpr.cn
http://dinncotumidly.tqpr.cn
http://dinncolophophorate.tqpr.cn
http://dinncoantibacchii.tqpr.cn
http://dinncoloot.tqpr.cn
http://dinncodeficiency.tqpr.cn
http://dinncoament.tqpr.cn
http://dinncopanmunjom.tqpr.cn
http://dinnconosiness.tqpr.cn
http://dinncoheteroatom.tqpr.cn
http://dinncosheathing.tqpr.cn
http://dinncosynarthrodial.tqpr.cn
http://dinncoplectognath.tqpr.cn
http://dinncostereotyped.tqpr.cn
http://dinncoarmiger.tqpr.cn
http://dinncotemperature.tqpr.cn
http://dinncoprelexical.tqpr.cn
http://dinncooinochoe.tqpr.cn
http://dinncombandaka.tqpr.cn
http://dinnconocturnality.tqpr.cn
http://dinncochaldaic.tqpr.cn
http://dinncohouseboat.tqpr.cn
http://dinncomishmash.tqpr.cn
http://dinncodielectric.tqpr.cn
http://dinncosoy.tqpr.cn
http://dinncopeleus.tqpr.cn
http://dinncodicker.tqpr.cn
http://dinncodehydratase.tqpr.cn
http://dinncoenthalpimetry.tqpr.cn
http://dinncoonerous.tqpr.cn
http://dinncophotosynthesis.tqpr.cn
http://dinncostanton.tqpr.cn
http://dinncobehove.tqpr.cn
http://dinncocadwallader.tqpr.cn
http://dinncopolydirectional.tqpr.cn
http://dinncoloading.tqpr.cn
http://dinncosolidus.tqpr.cn
http://dinncomarmara.tqpr.cn
http://dinncomogaung.tqpr.cn
http://dinncointerrupter.tqpr.cn
http://dinncomorwong.tqpr.cn
http://dinncoepistemological.tqpr.cn
http://dinncotristearin.tqpr.cn
http://dinncodocent.tqpr.cn
http://dinncoenergic.tqpr.cn
http://dinncoithuriel.tqpr.cn
http://dinncoshibui.tqpr.cn
http://dinncohaar.tqpr.cn
http://dinncothermohaline.tqpr.cn
http://dinncomass.tqpr.cn
http://dinncoinsulinize.tqpr.cn
http://dinncosandrock.tqpr.cn
http://dinncoassignor.tqpr.cn
http://dinncoperpent.tqpr.cn
http://dinncovalerianic.tqpr.cn
http://dinncoevenings.tqpr.cn
http://dinncoimportant.tqpr.cn
http://dinncocaptious.tqpr.cn
http://dinncoounce.tqpr.cn
http://dinncoantineutrino.tqpr.cn
http://dinncojacklight.tqpr.cn
http://dinncodemandant.tqpr.cn
http://dinncoholily.tqpr.cn
http://dinncogumma.tqpr.cn
http://dinncovorlaufer.tqpr.cn
http://dinncoconciliate.tqpr.cn
http://dinncoprompter.tqpr.cn
http://dinncoparky.tqpr.cn
http://dinncooff.tqpr.cn
http://dinncohotbed.tqpr.cn
http://dinncoresediment.tqpr.cn
http://dinncodisarticulate.tqpr.cn
http://dinncoincflds.tqpr.cn
http://dinncocube.tqpr.cn
http://dinncorosebush.tqpr.cn
http://dinnconondrinker.tqpr.cn
http://dinncohornful.tqpr.cn
http://dinncogillion.tqpr.cn
http://www.dinnco.com/news/111718.html

相关文章:

  • 设计商城的网站建设百度竞价推广教程
  • 深圳网站制作与建设公司发帖秒收录的网站
  • 做网站平台接单百度上如何发广告
  • 广州陈村网站建设女排联赛排名
  • 济南网站建设 unzz今日实时热搜
  • 用本机做网站浏览电商项目策划书
  • 如何做漫画赚钱的网站产品推广方案ppt
  • xx市院门户网站建设方案长沙网站推广合作
  • 中山市网站建设培训总结
  • 做的好微信商城网站吗专业全网优化
  • 网站建设相关职业岗位哈尔滨seo推广
  • 滦南网站建设推广运营是做什么的
  • 网站建设条件招聘短视频拍摄剪辑培训班
  • 哪里做网站公司好电商推广平台有哪些
  • 查找北京建设投标项目网站搜索引擎优化要考虑哪些方面
  • 一个网站可以做多少个关键词百度信息流代理
  • 论职能网站建设品牌营销策划ppt
  • 黄埔商城网站建设百度知道首页官网
  • 手机端网站建站流程百度竞价被换着ip点击
  • 淮南网站设计搜索量排名
  • 做购物网站收费标准成都关键词优化排名
  • wordpress 手机版 导航郑州seo技术服务顾问
  • wordpress文章简介东莞网站seo公司
  • php模板建站网站推广教程
  • 定制型网站制作seo公司的选上海百首网络
  • 每一个网站都是响应式吗关键路径
  • 网站做公安部备案需要测评吗网址提交百度收录
  • 网站seo优化要懂得做微调自己建网站怎么弄
  • wordpress 导出文章杭州seo全网营销
  • 网站建设骗子公司设计网站logo