python sftp

windows调用linux系统中的sftp功能。语言还是c++ 可以选择libcurl + OpenSSL + Zlib + Libssh2

结合QT编译,可能是自己太笨,搞了2天也没编译好环境,后来选择了pythonparamiko实现上传下载功能,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());
 

 

 

 

你可能感兴趣的:(python sftp)