Python 如果我叫波本,为什么NCat马上就结束了?

Python 如果我叫波本,为什么NCat马上就结束了?,python,subprocess,pipe,popen,netcat,Python,Subprocess,Pipe,Popen,Netcat,我必须在python3脚本中使用NCat stdin管道,我决定将其用于subprocess.Popen。但即使我称之为NCat,NCat也会立即返回错误代码2并写入:NCat:您必须指定要连接的主机。退出。。我的代码: import subsubprocess a = subprocess.Popen(['nc', '--keep-open', '--listen', '8000'], stdin = subprocess.PIPE, shell = True) ... 我试图把localh

我必须在python3脚本中使用NCat stdin管道,我决定将其用于
subprocess.Popen
。但即使我称之为NCat,NCat也会立即返回错误代码2并写入:
NCat:您必须指定要连接的主机。退出。
。我的代码:

import subsubprocess
a = subprocess.Popen(['nc', '--keep-open', '--listen', '8000'], stdin = subprocess.PIPE, shell = True)
...
我试图把
localhost
放在倒数第二个参数:

a = subprocess.Popen(['nc', '--keep-open', '--listen', 'localhost', '8000'], stdin = subprocess.PIPE, shell = True)

但它给出了一个结果。在控制台和
nc--保持打开--侦听8000
,以及
nc--保持打开--侦听localhost 8000
工作正常。我该怎么办?

我敢肯定,这里的问题是我最近遇到的<当您传递参数列表并指定
shell=True
时,code>Popen不会执行您期望的操作。当使用它们是相互排斥的时候,这是最幸福的。因此,不是:

a = subprocess.Popen(['nc', '--keep-open', '--listen', '8000'], stdin = subprocess.PIPE, shell = True)
我会这样做:

a = subprocess.Popen(['nc', '--keep-open', '--listen', '8000'], stdin = subprocess.PIPE)
或:

我对文档做了一些深入的研究,发现了一些有趣的小道消息,这些小道消息证实了我一直以来的直觉:

如果shell为True,建议将args作为字符串而不是序列传递

在shell=True的POSIX上,shell默认为/bin/sh。。。如果args 是一个序列,第一项指定命令字符串,并且 附加项将被视为 shell本身

因此,我猜在您的例子中,额外的参数被输入到
/bin/sh
,而不是
nc

a = subprocess.Popen(['nc --keep-open --listen 8000'], stdin = subprocess.PIPE, shell = True)