当前位置: 首页 > 工具软件 > PySVN > 使用案例 >

python之pysvn的那些坑

令狐建修
2023-12-01

使用详见官方文档,后面记录几个用到的方法

先安装

windows 安装

环境:win10,python3.7
http://pysvn.tigris.org/servlets/ProjectDocumentList?folderID=1768 下载对应版本,直接运行安装

centos 安装

环境:centos7,python3.7,pysvn1.8.0
centos下yum安装默认安装python2环境的
python3环境的安装参考这个

#python2 安装
yum install pysvn -y 

踩坑记录:从我安装情况来看,pysvn似乎时不兼容python3.7,因为一直没装上,下面的报错2一直搞不定,网上搜索的教程就算装上了也特别麻烦,果断换环境

# python3.6 安装
#下载
wget http://pysvn.barrys-emacs.org/source_kits/pysvn-1.8.0.tar.gz

#安装依赖 ,若不安装依赖会有报错,见下面
yum  install subversion-devel apr-devel apr-util-devel -y
#开始编译安装pysvn
tar xzf pysvn-1.8.0.tar.gz
cd pysvn-1.8.0/Source/
python3 setup.py configure
make
cd pysvn/
#查找python包的位置
find / -name site-packages
#创建pysvn文件夹
mkdir /usr/local/lib/python3.6/site-packages/pysvn
#把文件拷过去完成
cp __init__.py /usr/local/lib/python3.6/site-packages/pysvn
cp _pysvn_3_6.so /usr/local/lib/python3.6/site-packages/pysvn

报错1:运行python3 setup.py configure报错

错误:('Error:', 'Cannot find SVN include svn_client.h - use --svn-inc-dir')
解决:yum -y install subversion-devel

报错2:运行make报错,具体报错找不到了,反正就这个文件有错,网上也找不到什么解决办法

make: *** [IndirectPythonInterface.o] 错误 1

搜索了一下,安装成功的都是python3.6的,3.7就算成功了也是非常麻烦。。。权衡了一下,决定把python换成3.6的

果然十分顺利,安装完成,但是
报错3import pysvn的时候报错

[root@sonar pysvn]# python3
Python 3.6.5 (default, Apr  4 2020, 21:12:24) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pysvn
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3/lib/python3.6/site-packages/pysvn/__init__.py", line 106, in <module>
    import pysvn._pysvn_3_7
ModuleNotFoundError: No module named 'pysvn._pysvn_3_7'

搜了半天也没搜到怎么回事,冥冥之中觉得是刚才安装过了,第二次安装的时候有些文件没覆盖到,重下了pysvn1.8.0安装就成功了

测试

python3下import pysvn,没报错就成功了

Client.log

获取svn版本库里日志

Client.log(url_or_path,
     revision_start=pysvn.Revision( opt_revision_kind.head ),
     revision_end=pysvn.Revision( opt_revision_kind.number, 0 ),
     discover_changed_paths=False,
     strict_node_history=True,
     limit=0,
     peg_revision=pysvn.Revision(opt_revision_kind.unspecified ),
     include_merged_revisions=False,
     revprops=list_of_revprop_names)

各个参数:
url_or_pathsvn仓库地址
revision_start 从某个版本开始取日志
revision_end 到某个版本结束
discover_changed_paths,strict_node_history二选一,前者表示(?),后者表示日志不会交叉复制
limit限制返回最大日志数,0表示返回所有
peg_revision 若url_or_path不存在,则自动选择上一个存在的修订版本
include_merged_revisions不知道
revprops一个字符串列表,不知道干嘛用的

返回

res = {author:xxx,date:xxx,message:xxx,revision:xxx,changed_paths{path:xxx,action:xxx,copyfrom_path:xxx,copyfrom_revision:xxxx}}

其中path是代码相对路径,action是添加/删除/修改状态

注意

直接输出Client.log会得到一个空数组,要循环输出每一个值,如下

for info in log:
        print(info.author,info.date,info.message,info.revision)
        for e in info.changed_paths:
            print(e.path)
            print(e.action)
            print(e.copyfrom_path)
            print(e.copyfrom_revision)

Client.export

根据代码路径导出代码
写法:

import pysvn
client = pysvn.Client()
file_content = client.export(svnurl, localpath)

具体参数:

revision = \
export( src_url_or_path,
        dest_path,
        force=False,
        revision=pysvn.Revision(),
        native_eol=None,
        ignore_externals=False,
        recurse=True,
        peg_revision=pysvn.Revision( opt_revision_kind.unspecified ),
        depth=depth,
        ignore_keywords=False )

根据svn代码地址src_url_or_path将文件导出到dest_path目录下
ignore_externals=False 忽略外部参数
recurse=False只导出单个文件,设为True递归导出文件夹下文件,默认为True
peg_revision指定某个版本的代码地址
depth导出目录的深度

实践

写了一个python脚本根据日志定时获取svn仓库代码并交给cobra扫描的功能。
还没想好放哪,再说。。。

 类似资料: