Python subprocess.Popen错误:不可编辑

Python subprocess.Popen错误:不可编辑,python,Python,我有一个问题快把我逼疯了,我开始为我的工作创建一些有用的脚本。。用python 2.7编写脚本。。我在读一本书,书名是《Python for Unix and Linux administrators..”,我知道我应该用Python 3编程,但目前Python 2.7为我提供了解决方案。。因此,我正在创建一个使用子流程模块的脚本 import subprocess from subprocess import PIPE, Popen nmap = "nmap" argumento_nmap

我有一个问题快把我逼疯了,我开始为我的工作创建一些有用的脚本。。用python 2.7编写脚本。。我在读一本书,书名是《Python for Unix and Linux administrators..”,我知道我应该用Python 3编程,但目前Python 2.7为我提供了解决方案。。因此,我正在创建一个使用子流程模块的脚本

import subprocess
from subprocess import PIPE, Popen


nmap = "nmap"
argumento_nmap = "-p"
port_nmap = "22"
port2_nmap = "2104"
open_port = "open"
closed_port = "closed"
ip_nmap = "192.168.170.52"

escaneo = subprocess.Popen([nmap,argumento_nmap,puerto_nmap,ip_nmap],         
stdout=PIPE)
print(escaneo.communicate()[0].split())
scan_result = escaneo
if port_nmap in scan_result:
    print " Puerto abierto"
在我的脑海里。。。脚本应验证打开的\u端口(22)是否打开或关闭。。但每次运行代码时,我都会遇到下一个错误:
TypeError:类型为“Popen”的参数不可编辑 .. 在网上搜索时,我发现了一些函数,如check_output(),但它们对我没有帮助。。是否有办法检查该变量是否进入扫描结果列表

对不起,我的英语很差,我希望你们有问题

问候


Esteban

您得到的具体错误是因为
y中的x
期望y是一个迭代器,python将在其中搜索x。我想您需要设置
scan\u result=escaneo.communicate()[0]
。这将返回一个带标准输出的字符串,因此如果扫描结果中的端口映射为:,则将正常工作。但是,如果字符串“22”出现在字符串中的任何位置,它将返回true,因此您可能希望像在打印语句中一样进行拆分。

thx for answer to me@rcriii我可以进一步研究我遇到的问题并找到解决方案<代码>扫描结果=escaneo.communicate[0]该代码对我不起作用。。它给了我下一个错误:
TypeError:'instancemethod'对象没有属性'\uuu getitem\uuuu'
,但你的回答迫使我进行更多的研究。。所以凌晨3点我就能得到我想要的。。这是密码

import subprocess
from subprocess import Popen, PIPE, STDOUT 
nmap = "nmap"
argumento_nmap = "-p"
port_nmap = "22"
port2_nmap = "2104"
open_port = "open"
closed_port = "closed"
ip_nmap = "localhost"
salida = "stdout.txt"
atributos_salida = "wb"
error = "stderr.txt"
atributos_error = "wb"
lista = Popen([nmap, argumento_nmap, port_nmap,ip_nmap], stdin=PIPE,          stdout=PIPE, stderr=STDOUT, close_fds=True)
resultado = lista.communicate()[0]
print resultado
伙计!如果你有什么建议,请告诉我

格里茨


Esteban

为什么要编写
scan\u result=escaneo
escaneo
不是扫描结果。因为我认为我可以将结果转换为字符串。。这在代码中是不相关的。嗨,埃斯特班,你知道了
listo.communicate
是一个方法,而
listo.communicate()
给出函数的返回值,该函数是一个具有
\uu getitem\uuuu
方法的元组。我已经更新了上面的答案以更正错误。谢谢你的帮助。。现在我还有一些疑问。。。我应该为此打开一个新线程吗?我是新来的堆栈溢出。。但是这些疑问与这段代码有关。我不是一个专家,但是如果它与这个问题无关(即使在同一段代码中),我会问一个不同的问题。你读过吗?谢谢你,伙计我读过了是的。。我遇到的问题(我找到了一个解决方案)不是一个Popen错误。。祝您有个美好的一天