Python: Verifique a existência do comando shell antes da execução [closed]

3

Estou tentando encontrar uma maneira de verificar a existência de um comando shell antes de sua execução.

Por exemplo, eu vou executar o comando ack-grep. Então, estou tentando fazer:

import subprocess
from subprocess import PIPE

cmd_grep = subprocess.Popen(["ack-grep", "--no-color", "--max-count=1", "--no-group", "def run_main", "../cgedit/"], stdout=PIPE, stderr=PIPE)

Então, se eu executar

cmd_grep.stderr.read()

Eu recebo '' como a saída. Mas eu não tenho o comando ack-grep no meu caminho. Então, por que Popen não está colocando a mensagem de erro na minha variável .stderr?

Além disso, há uma maneira mais fácil de fazer o que estou tentando fazer?

    
por Gabriel L. Oliveira 04.06.2010 / 17:47

5 respostas

3

Você pode usar o módulo subprocesso em Python 3 ou o módulo commands para o Python 2 da seguinte forma:

status, result = subprocess.getstatusoutput("ls -al")

status, result = commands.getstatusoutput("ls -al")

Em seguida, teste o valor de status .

Exemplos do site:

>>> import subprocess
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
    
por 02.08.2010 / 01:49
2

você não poderia usar o comando "which" de alguma forma? O comando which executa automaticamente uma pesquisa por um aplicativo nos caminhos. Eu acho que você precisaria apenas chamar este comando e passar o nome do comando que você quer procurar, e então analisar os resultados.

    
por 02.08.2010 / 02:09
1

Para situações como esta, eu uso:

def find_program(prog_filename, error_on_missing=False):
    bdirs = ['$HOME/Environment/local/bin/',
             '$HOME/bin/',
             '/share/apps/bin/',
             '/usr/local/bin/',
             '/usr/bin/']
    paths_tried = []
    for d in bdirs:
        p = os.path.expandvars(os.path.join(d, prog_filename))
        paths_tried.append(p)
        if os.path.exists(p):
            return p
    if error_on_missing:
        raise Exception("*** ERROR: '%s' not found on:\n  %s\n" % (prog_filename, "\n  ".join(paths_tried)))
    else:
        return None

Então você pode fazer algo como:

grep_path = find_program('ack_grep', False)
if grep_path is None:
    # default to standard system grep
    grep_path = 'grep'
    
por 02.08.2010 / 00:40
0

Eu finalmente deixei isso funcionando assim:

try:

    cmd_grep = ["ack-grep", "--no-color", "--max-count=1", "--no-group", function_definition, file_path]

    first_exec = Popen(cmd_grep,stdout=PIPE)

    execution = Popen(cmd_sed, shell=True, stdin=first_exec.stdout, stdout=PIPE)

except:

    #use grep instead

    cmd_grep = cmd_grep = r'grep -R -n "' + function_definition + '" ' + file_path

    execution = Popen(cmd_grep + '|' + cmd_sed,shell=True,stdout=PIPE)

output = execution.stdout.read()
    
por 04.06.2010 / 19:21
-1

Isso deve funcionar para você:

import subprocess 
from subprocess import PIPE
import shutil 

cmd = ["ack-grep", "--no-color", "--max-count=1", "--no-group", "def run_main", "../cgedit/"]
path_to_cmd = shutil.which(cmd[0])    
if path_to_cmd is None:
     print(f"There is no {cmd[0]} on the path!")
else:
    cmd_grep = subprocess.Popen(cmd,  stdout=PIPE, stderr=PIPE) 

O processo de pensamento ......... Eu usei esta solução para começar:

import subprocess
status, response = subprocess.getstatusoutput('which ack-grep')
print(f'Exitcode: {status}, Output: {response}')

Mas isso resultou em uma resposta específica apenas dos sistemas Linux.

import shutil
shutil.which(cmd[0])

Retorna o caminho para um executável quando "ack-grep" é chamado ou None se nada é chamado.

    
por 27.07.2018 / 03:55