python checksum md5 with argv called from a main.p

2019-09-18 10:04发布

问题:

Is reference with my code to check the md5 from two sources in my link:

python saving output from a for iteration and subprocess for checksum

I achieve getting md5 respectively. (Any improvements are always welcome) here is my code:

#!/usr/bin/env python

import logging
import hashlib
import os
import sys
from sys import *
import subprocess

#script, path, path2 = argv

outfile = "md5_origen.txt"
outfile2 = "md5_destino.txt"
cmdargs = sys.argv
total = len(sys.argv) -1

#EJEMPLO PARA SACAR LOS ARGUMENTOS
################
#for a in cmdargs[1:]:
#       print  a
################        

def saca_sum_origen(y):
        #si cambia de directorio, que cambio de archivo para despues ser evaluado.
        if a != sys.argv[total]: 
                ck = "md5 %s/%s" % (a,y)
                p = subprocess.Popen(ck, stdout=subprocess.PIPE, shell=True)
                (output, err) = p.communicate()
                with open(outfile,'a') as text_file:
                        text_file.write("%s" % output)
        else:
                ck = "md5 %s/%s" % (a,y)
                p = subprocess.Popen(ck, stdout=subprocess.PIPE, shell=True)
                (output, err) = p.communicate()
                with open(outfile2,'a') as text_file:
                        text_file.write("%s" % output)

#obtenemos los argumentos
for a in cmdargs[1:]:
        #esto es que cada directorio enliste los files que tiene adentro
        for x in (file for file in os.listdir(a)):
                if not "~" in x:
                        #que obtenga su MD5
                        saca_sum_origen(x)

Wondering how can I start building a menu from an other python script.

My first approach is the following:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from sys import *
import sys
import subprocess
import cksum_v2
borrar = os.system('clear')

opcion = True
    while opcion:
            print "Select an option: \n"
            print "1. Create a md5 report from source and target only"
            try:
                    opcion = int(raw_input(">_ "))
                    if opcion == 1:
                            print "Jot down your input folder"
                            origen  = raw_input()
                            print "Now your output folder"
                            destino = raw_input()
                            subprocess.call(["./cksum_v2.py", origen, destino])
                            borrar
                            print "Done!"
                            print "¿Want an other? y/n"
                            try:
                                    descicion = str(raw_input(">_ "))       
                                    if descicion == "y":
                                            opcion = True
                                    elif descicion == "n":
                                            print "BYE"
                                            opcion = False
                                    else:
                                            print "ADIOS!!!"
                                            opcion = False
                            except:
                                    borrar
                                    print "BYE"
                                    opcion = False

                    elif opcion >1 or opcion <4:
                            os.system('clear')
                            print "Under construction"
                            opcion = True
                    elif  opcion >5:
                            print "Doesnt exist that option, an other?"
                            opcion = True
            except:
                    print "DOnt get mad, BYE touchy!!"
                    opcion = False

回答1:

It looks like you want to call saca_sum_origen with a source and a destination, and right now it just takes 1 argument for the source. The function just needs to be modified to take those arguments:

(I simplified it a bit here)

def saca_sum_origen(source, dest):
    ck = "md5 %s" % source
    p = subprocess.Popen(ck, stdout=subprocess.PIPE, shell=True)
    (output, err) = p.communicate()
    with open(dest,'a') as text_file:
    text_file.write(str(output))

Then just replace this line subprocess.call(["./cksum_v2.py", origen, destino]) with cksum_v2.saca_sum_origen(origen, destino)

By the way, it looks like you're trying to make a "shortcut" for a function with this line borrar = os.system('clear'). All this does is assigns the output of os.system('clear'), (which is nothing) to the variable borrar, and then when you're trying to "call" it within your menu code, it's actually not doing anything. If you really want to create an "alias" function, you can make it a function: def borrar: os.system('clear'), and don't forget the parenthesis when you call it: borrar()