Python代码,子进程是否与glob一起工作?

时间:2014-05-16 02:38:17

标签: python sftp

缺点是我需要一个程序将所有txt文件从本地目录通过sftp上传到特定的远程目录。如果我从sftp命令行运行mput * .txt,而我已经在正确的本地目录中,那就是我正在拍摄的内容。

这是我尝试的代码。我运行它时没有错误,但是当我sftp到服务器并且上传目录时它没有结果,它是空的。我可能在一起咆哮着错误的树。我看到其他解决方案,如lftp在bash中使用mget ...但我真的希望这与python一起使用。无论哪种方式,我还有很多需要学习的东西。这是我在阅读了一些stackoverflow用户建议的内容之后想出来的,一些可能有用的库。我不确定我能用subprocess进行“for all in allfiles:”。

import os
import glob
import subprocess 

os.chdir('/home/submitid/Local/Upload') #change pwd so i can use mget *.txt and glob similarly 

pwd = '/Home/submitid/Upload' #remote directory to upload all txt files to

allfiles = glob.glob('*.txt') #get a list of txt files in lpwd

target="user@sftp.com"


sp = subprocess.Popen(['sftp', target], shell=False, stdin=subprocess.PIPE)


sp.stdin.write("chdir %s\n" % pwd) #change directory to pwd

for i in allfiles:
    sp.stdin.write("put %s\n" % allfiles) #for each file in allfiles, do a put %filename to pwd

sp.stdin.write("bye\n")       


sp.stdin.close()

2 个答案:

答案 0 :(得分:0)

当您遍历allfiles时,您没有传递迭代器变量sp.stdin.write,而是传递allfiles本身。它应该是

for i in allfiles:
    sp.stdin.write("put %s\n" % i) #for each file in allfiles, do a put %filename to pwd

在发出命令之前,您可能还需要等待sftp进行身份验证。您可以从流程中读取stdout,或者在代码中添加time.sleep个延迟。

但为什么不使用scp并构建完整的命令行,然后检查它是否成功执行?类似的东西:

result = os.system('scp %s %s:%s' % (' '.join(allfiles), target, pwd))
if result != 0:
    print 'error!'

答案 1 :(得分:0)

您无需迭代allfiles

sp.stdin.write("put *.txt\n")

就够了。您指示sftp一次性放置所有文件,而不是逐个放置。