python:subprocess.communicate无法正常工作

时间:2017-05-22 12:49:10

标签: python python-2.7 python-3.x subprocess

我想在subprocess.communicate中输入一个参数,但它总是超出我的预期。 文件夹树:

├── file1
├── file2
├── main.py

main.py的内容:

import subprocess
child = subprocess.Popen(["ls"], stdin=subprocess.PIPE,  universal_newlines=True)
filepath = '/Users/haofly'
child.communicate(filepath)

无论我将文件路径更改为什么,结果只列出当前文件夹(file1,file2,main.py)。

我是否误解了沟通?我如何向Popen发送数据?

如果我想发送密码,ssh命令怎么样?

subprocess.Popen(['ssh', 'root@ip'], stdin=subprocess.PIPE, universal_newlines=True)

3 个答案:

答案 0 :(得分:1)

我认为您错过了Popen电话中的shell参数:

import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode

' LS'可能不是说明这个概念的最佳命令,但如果你想将参数传递给命令,你必须做类似的事情:

cmd = ['cmd', 'opt1', 'optN']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           stdin=subprocess.PIPE)
out, err = p.communicate('args')
print out

答案 1 :(得分:1)

手动使用ls时,是否单独键入ls,按Enter键,然后键入文件路径以响应提示?这就是你在这里尝试使用它的方式 - .communicate()的参数成为子进程的标准输入,实际上ls完全忽略了。它希望将目录列为命令行参数,您可以将其指定为["ls", filepath]

答案 2 :(得分:1)

您无法将数据“管道”到router.get('/index',function(req, res){ if(req.session && req.session.user) { Schemes.User.findOne({eMail:req.session.user.eMail}, function(err,user) { if(!user) { req.session.reset(); res.render('login',{error:"Please log in ..."}) } else { res.locals.user=user; res.render('index',{user:user, title: 'Index' }); } }); } else { res.render('login',{error:"Please log in ..."}) } }); - 它会根据提供的CLI参数列出目录 - 但您应该能够使用ls来实现您的目标(基本上将您的文件夹作为xargs的参数如果你不想为它提供命令本身:

ls