博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
py-faster-rcnn之python引入_caffe.so
阅读量:5129 次
发布时间:2019-06-13

本文共 2781 字,大约阅读时间需要 9 分钟。

本文并不给出“编写一个c++代码,然后编译为.so文件,然后在python中引入”的hello world,需要的请参考:

本文意在强调,python的import,引入的不仅是.py(以及.pyc)文件,还可以引入.so文件

首先明确下,python的模块,是指:一个包含若干.py文件的目录dir,并且包含一个__init__.py(内容可以为空,但不能不存在这个文件)

然后,当你需要使用这个目录dir下的某个文件some.py,那就这样引入:

import dir.some

以及,还可以用更复杂的from xx import yy这种语法。

那么这个import是按照什么路径查找的?上面这个import dir.some是从相对路径(当前路径)查找,有时候还有import cv2这种用法。其实是从python内部的sys.path中查找的。当然,你想添加新的目录到“查找目录”中,要么在python代码中往sys.path上追加东西,要么在shell里设定PYTHONPATH包含你所需要的目录。增加到PYTHONPATH的会放到sys.path中。

比如,我的sys.path

495962-20161212000341257-47511757.png

可以发现,/usr/lib/python2.7/dist-packages包含在sys.path中。而import cv2所引入的cv2所在路径为/usr/lib/python2.7/dist-packages/cv2.86_64-linux-gnu.so`。咦,怎么不是cv.py呢?总之,在sys.path包含的目录下,找到的不仅仅是.py和.pyc文件,还有众多的.so文件。而且,大都可以引入(import)

所以,要明确一点:import xxx引入的不仅仅是.py(c)文件,还可以是.so文件

================= 分割线 ================

好了,现在应该可以知道,在py-faster-rcnn中,caffe-fast-rcnn/python/caffe/pycaffe.py文件第13行, from ._caffe import SGDSolver 是啥意思,一目了然:将当前目录下_caffe.so引入(也就是caffe-fast-rcnn/python/caffe/_caffe.so)。

另:_caffe.socaffe-fast-rcnn/python/CMakeLists.txt中指定的__linkname:

if(NOT HAVE_PYTHON)  message(STATUS "Python interface is disabled or not all required dependencies found. Building without it...")  return()endif()include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR} ${Boost_INCLUDE_DIRS})file(GLOB_RECURSE python_srcs ${PROJECT_SOURCE_DIR}/python/*.cpp)   #!! GLOB_RECURSE递归查找,其实只找到一个,${PROJECT_SOURCE_DIR}/python/caffe/_caffe.cppadd_library(pycaffe SHARED ${python_srcs})target_link_libraries(pycaffe ${Caffe_LINK} ${PYTHON_LIBRARIES} ${Boost_LIBRARIES})set_target_properties(pycaffe PROPERTIES PREFIX "" OUTPUT_NAME "_caffe")caffe_default_properties(pycaffe)if(UNIX OR APPLE)    set(__linkname "${PROJECT_SOURCE_DIR}/python/caffe/_caffe.so")  #!! _caffe.cpp被链接到_caffe.so文件    add_custom_command(TARGET pycaffe POST_BUILD                       COMMAND ln -sf $
"${__linkname}" COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/python/caffe/proto COMMAND touch ${PROJECT_SOURCE_DIR}/python/caffe/proto/__init__.py COMMAND cp ${proto_gen_folder}/*.py ${PROJECT_SOURCE_DIR}/python/caffe/proto/ COMMENT "Creating symlink ${__linkname} -> ${PROJECT_BINARY_DIR}/lib/_caffe${Caffe_POSTFIX}.so")endif()# ---[ Installfile(GLOB files1 *.py requirements.txt)install(FILES ${files1} DESTINATION python)file(GLOB files2 caffe/*.py)install(FILES ${files2} DESTINATION python/caffe)install(TARGETS pycaffe DESTINATION python/caffe)install(DIRECTORY caffe/imagenet caffe/proto caffe/test DESTINATION python/caffe)

注意到图中关键两行(#!!标出),意思是caffe-fast-rcnn/python/caffe/_caffe.cpp编译成caffe-fast-rcnn/python/caffe/_caffe.so。这之后,就可以用import _caffe引入_caffe.so了。

转载于:https://www.cnblogs.com/zjutzz/p/6161094.html

你可能感兴趣的文章
17.2 The DispatcherServlet
查看>>
数据库建表需要注意的事
查看>>
cmake编译win下64位obs
查看>>
iOS进阶第一节 数据读写之文件读写
查看>>
P1108 低价购买
查看>>
【转】C++11 标准新特性:Defaulted 和 Deleted 函数
查看>>
C# - 泛型委托
查看>>
咏南开发框架调用存储过程演示
查看>>
Jackson2.1.4 序列化对象时,过滤null的属性 empty的属性 default的属性
查看>>
DevStack添加Swift
查看>>
RadControls for Silverlight Q2 2012 试用版探究
查看>>
Handling bundles in activities and fragments
查看>>
数据仓库的设计目的
查看>>
Linux C高级编程——网络编程基础(1)
查看>>
IOS版本号被拒的经历
查看>>
JavaScript 本地对象、内置对象、宿主对象
查看>>
servlet的url-pattern匹配规则详细描述
查看>>
spring boot 整合 云之讯 demo
查看>>
《大型网站技术架构》1:概述
查看>>
(PatchGANs)Pecomputed Real-time Texture Synthesis With Markovian Generative Adversarial Networks
查看>>