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
#include
#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(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文件
Ø 提取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文件到发布根目录
Ø 如果是用vs2010编译,要复制对应的文件
~/redist/x86/Microsoft.VC100.CRT 目录下的两个文件:
msvcp100.dll
msvcr100.dll
Ø Boost.python库引用
boost_python-vc100-mt-1_49.dll
boost_python-vc100-mt-1_49.lib
Ø py2exe c++嵌入python打包的bug
如果是C++嵌入python生成的library.zip中缺少一些文件,生成的程序会报丢失文件的错误 ImportError: No module named site
需要把python中的lab文件从新打包(C:\Python27\Lib)
在c++文件中设置python的运行目录
#include
#include
#include
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());