2017-09-29 7 views
0

J'ai donc fait et scanner IP/nom d'hôte et j'essaie d'obtenir la sortie à imprimer dans un fichier après qu'il exécute le ping ou ne parvient pas à exécuter le ping. Mon problème est que je reçois ces erreurs:Comment faire pour écrire Popen dans un fichier

Traceback (most recent call last): 
    File ".\IPlookup.py", line 59, in <module> 
    print >> IPtext," is down!", 'Filename:', filename 
AttributeError: 'str' object has no attribute 'write' 

Traceback (most recent call last): 
File ".\IPlookup.py", line 55, in <module> 
    print >> output, 'Filename:', filename 
AttributeError: 'Popen' object has no attribute 'write' 

C'est ce que le code actuel ressemble

#This here code is used to scan IP's hostnames or files and ping them, then if there is 0% packet loss it does an nslookup... 

import sys 
import os 
import subprocess 

#This is supposed to print the output to a txt file but boy howdy does it not work 

elif userType == '-l': 
    IPtext = raw_input("Please enter IP or URL: ") 
    response = os.system("ping -c 1 " + IPtext) 
    output = subprocess.Popen(['nslookup',IPtext]) 
    if response == 0: 
     f = open('out.txt','w') 
     print >> output, 'Filename:', filename 
     f.close() 
    else: 
     f = open('out.txt','w') 
     print >> IPtext," is down!", 'Filename:', filename 
     f.close() 

Y at-il un moyen d'obtenir à la fois la sortie str et le popen d'écrire dans un fichier ou faire J'ai besoin de changer complètement mon code?

Résolu une partie de mon problème en faisant cela au lieu

elif userType == '-l': 
    with open('out.txt','a') as f: 
     IPtext = raw_input("Please enter IP or URL: ") 
     response = os.system("ping -c 1 " + IPtext) 
     output = subprocess.Popen(['nslookup',IPtext]) 
     if response == 0: 
      f.write(output) 
      f.close() 
     else: 
      f.write(IPtext) 
      f.close() 

La seule chose qui ne fonctionne plus est l'impression de popen qui jette l'erreur

TypeError: Argument 1 doit être une chaîne ou lire tampon de caractères -Seulement, non popen

elif userType == 't -l' or userType == 't --logfile': 
     with open('Pass.txt','a') as f: 
     IPtext = raw_input("Please enter IP or URL: ") 
     response = os.system("ping -c 1 " + IPtext) 
     merp = subprocess.Popen(['nslookup',IPtext], stdout=subprocess.PIPE) 
     out, err = merp.communicate() 
     if response == 0: 
      f.write('\n') 
      f.write(out) 
      f.close() 
     else: 
      with open('Fail.txt','a') as f: 
       f.write('\n') 
       f.write(IPtext) 
       f.close() 

Répondre

1

Si je comprends votre problème correctement, la ligne de f.write(output) jette le TypeError.

C'est le cas car la sortie est un objet Popen dans votre cas. Remplacer ces lignes:

output = subprocess.Popen(['nslookup',IPtext]) 
    if response == 0: 
     f.write(output) 

avec ces:

# ... everything before your .subprocess.Popen(...) line 
popen = subprocess.Popen(['nslookup',IPtext], stdout=subprocess.PIPE)# this is executed asynchronus 
popen.wait() # this is to wait for the asynchron execution 
resultOfSubProcess, errorsOfSubProcess = popen.communicate() 
# resultOfSubProcess should contain the results of Popen if no errors occured 
# errorsOfSubProcess should contain errors, if some occured 
    if response == 0: 
     f.write(resultOfSubProcess) 
     # ... the rest of your code 

Edit: Vous pouvez également vérifier contre une variable resultOfSubProcess vide ou des erreurs dans errorsOfSubProcess avant de poursuivre