文章出處

本文并不給出“編寫一個c++代碼,然后編譯為.so文件,然后在python中引入”的hello world,需要的請參考:http://www.oschina.net/question/437227_124449

本文意在強調,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

可以發現,/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.cpp

add_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 $<TARGET_LINKER_FILE:pycaffe> "${__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()

# ---[ Install
file(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了。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()