本文并不给出 "编写一个 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
这种用法。其实是从 python 内部的 sys.path 中查找的。当然,你想添加新的目录到 "查找目录" 中,要么在 python 代码中往
- import cv2
上追加东西,要么在 shell 里设定 PYTHONPATH 包含你所需要的目录。增加到 PYTHONPATH 的会放到 sys.path 中。
- sys.path
比如,我的 sys.path
可以发现,
包含在
- /usr/lib/python2.7/dist-packages
中。而
- sys.path
所引入的
- import cv2
/usr/lib/python2.7/dist-packages/cv2.86_64-linux-gnu.so`。咦,怎么不是 cv.py 呢?总之,在 sys.path 包含的目录下,找到的不仅仅是. py 和. pyc 文件,还有众多的. so 文件。而且,大都可以引入 (import)
- cv2所在路径为
所以,要明确一点:import xxx 引入的不仅仅是. py(c) 文件,还可以是. so 文件
================= 分割线 ================
好了,现在应该可以知道,在 py-faster-rcnn 中,
文件第 13 行,
- caffe-fast-rcnn/python/caffe/pycaffe.py
是啥意思,一目了然:将当前目录下
- from ._caffe import SGDSolver
引入 (也就是
- _caffe.so
)。
- caffe-fast-rcnn/python/caffe/_caffe.so
另:
是
- _caffe.so
中指定的
- caffe-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
来源: http://www.cnblogs.com/zjutzz/p/6161094.html