我想在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)
答案 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