windows调用linux系统中的sftp功能。语言还是c++ 可以选择libcurl + OpenSSL + Zlib + Libssh2,
结合QT编译,可能是自己太笨,搞了2天也没编译好环境,后来选择了python的paramiko实现上传下载功能,tarfile用来解压,用中午的午休时间搞定。
选择这条路,最后证明是噩梦的开始,如c++调用python,c++中的多线程在python中的支持,python环境打包,win7下编译好的程序在winXP中由于python27.dll的依赖不能用...
成也python,败也python,后续博客中会陆续更新。
环境:
Python 2.7 pythonxy2.7集成
Paramiko: paramiko-1.7.7.1.zip
pythonsftp.pyc 文件如下:
# -*- coding: utf-8 -*- import sys import os import getpass import socket import paramiko from datetime import date, timedelta import tarfile #解压 def pythonTgz(stcPath,tagPath): #已"r:gz"格式打开 tarobj = tarfile.open(stcPath, "r:gz") for tarinfo in tarobj: tarobj.extract(tarinfo.name, tagPath) tarobj.close() #上传下载 def pythonSftp(isget,hostname,port,sftpUsername,sftpPassword,remotepath,localpath,fileList): #创建一个连接实例 t = paramiko.Transport((hostname,port)) #连接服务器 t.connect(username = sftpUsername, password = sftpPassword) #创建一个sftp客户端实例 pSftp = paramiko.SFTPClient.from_transport(t) #循环每个文件上传/下载 for f in fileList: pSftp.put(os.path.join(localpath,f),remotpathtemp) …
代码实现很挫,很挫...
boost对python的引用
添加vc++对python、boost库的应用
拷贝相关文件
拷贝上一步生成的动态编译库到程序目录
boost_pyhton-vc100-mt-1_49.dll
boost_pyhton-vc100-mt-1_49.lib
boost_pyhton-vc100-mt-gd_49.dll
boost_pyhton-vc100-mt-gd_49.lib
拷贝python上传下载实现代码
pythonsftp.pyc
程序实现
#include <boost/python.hpp> #include <Python.h> #ifdef _DEBUG #pragma comment(lib, "boost_python-vc100-mt-gd-1_49.lib") #pragma message("boost_python --> debug~lab") #else #pragma comment(lib, "boost_python-vc100-mt-1_49.lib") #pragma message("boost_python --> reless~lib") #endif … int psdsftp::unCompres( const std::string &resPath, const std::string &tagPath ) { //检查功能有效性 if(!Py_IsInitialized()) { cout <<"初始化失败!"<< endl; return -1; } // 调用Python中的sftp函数并获得返回值 try { call_method<char *>(module.get(), m_funUnCom.c_str(), resPath.c_str(), tagPath.c_str() ); } catch (...) { cout <<"出错了!~"<< endl; } return 0; }
python 打包选择的是 py2exe(pythonxy中已经安装)
创建配置文件mysetup.py
from distutils.core import setup
import py2exe
import sys
import os
import getpass
import socket
import paramiko
import tarfile
setup(console = ["pythonsftp.py"])
...
pythonsftp.py为要打包的python文件
<!--[if !supportLists]-->Ø <!--[endif]-->提取python文件
复制mysetup.py到程序发布文件夹,在cmd窗口指向程序文件夹
cd D:\work\SFTP\SFTPPython\test_boost_python_cmd
python mysetup.py py2exe
参考:
http://blog.csdn.net/andoring/article/details/6616430
http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage
复制相关的文件
复制pythonsftp.pyc文件到发布根目录
<!--[if !supportLists]-->Ø <!--[endif]-->如果是用vs2010编译,要复制对应的文件
~/redist/x86/Microsoft.VC100.CRT 目录下的两个文件:
msvcp100.dll
msvcr100.dll
<!--[if !supportLists]-->Ø <!--[endif]-->Boost.python库引用
boost_python-vc100-mt-1_49.dll
boost_python-vc100-mt-1_49.lib
<!--[if !supportLists]-->Ø <!--[endif]-->py2exe c++嵌入python打包的bug
如果是C++嵌入python生成的library.zip中缺少一些文件,生成的程序会报丢失文件的错误 ImportError: No module named site
需要把python中的lab文件从新打包(C:\Python27\Lib)
在c++文件中设置python的运行目录
#include <Windows.h> #include <stdlib.h> #include <stdio.h> psdsftp::psdsftp(void) :m_pythonSftp("pythonsftp") ,m_funSFTP ("pythonSftp") ,m_funUnCom ("pythonTgz") { // 得到当前可执行文件所在的目录 char szPath[10240]; GetModuleFileName(NULL, szPath, sizeof(szPath)); char* p = strrchr(szPath, '\\'); if (p == NULL) { printf("不能获得文件路径!\n"); return ; } *p = 0; cout << szPath << endl; // 设定运行时的PATH std::string PATHS = szPath; std::string pathdlls = "sys.path.append(r'" + PATHS + "\\stdlib.zip')"; std::string pathlib = "sys.path.append(r'" + PATHS + "\\dlls')"; cout << pathdlls << endl; cout << pathlib << endl; Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString(pathdlls.c_str()); PyRun_SimpleString(pathlib.c_str());