Chame o script Python do bash com argumento

96

Eu sei que posso executar um script Python a partir do meu script bash usando o seguinte:

python python_script.py

Mas e se eu quisesse passar uma variável / argumento para meu script Python do meu script bash. Como eu posso fazer isso?

Bash bash trabalhará em um nome de arquivo e, em seguida, python fará o upload, mas eu preciso enviar o nome de arquivo de bash para python quando eu chamá-lo.

Jimmy
fonte
ao executar python python_script.pyem seu shell padrão no Debian, você já está usando o bash ... então faça em seu script bash:python python_script.py arg1 arg2 ...
Oz123
@Jimmy Unprepared Question, eu acho, é muito fácil Link: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Respostas:

140

Para executar um script python em um script bash, você precisa chamar o mesmo comando que faria em um terminal. Por exemplo

> python python_script.py var1 var2

Para acessar essas variáveis ​​em python, você precisará

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
iathedrake
fonte
Obrigado. No entanto, esta forma restringe o arquivo python para apenas um caso de uso. Existe uma maneira de chamar métodos de um arquivo python com parâmetros dinâmicos em scripts bash? Dessa forma, poderemos usar o mesmo arquivo python. Tentei fazer isso com chamadas de métodos de arquivo python com $ var dentro do script bash. Mas de alguma forma falhou.
burcak
@burcak Se você deseja executar o arquivo python paralelamente com base nos parâmetros dinâmicos, primeiro construa o caminho completo << caminho do local do script python >> / << nome do script python >> param1 param2 | << caminho do local do script python >> / << nome do script python >> param3 param4 no script bash, então passe a saída como um argumento para o script python abaixo, import sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') para cmd em cmds: print ('call -' + cmd) subprocess.Popen (cmd, shell = True) print ('call cmds completed')
Qui
22

Usar

python python_script.py filename

e em seu script Python

import sys
print sys.argv[1]
NPE
fonte
22

Ao lado sys.argv, também dê uma olhada no módulo argparse , que ajuda a definir opções e argumentos para scripts.

O módulo argparse torna mais fácil escrever interfaces de linha de comando amigáveis.

Miku
fonte
Eu concordo, para mim argparse é uma opção muito melhor do que sys.argv
Mo Ali
9

Opção incorporada:

Envolva o código python em uma função bash.

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

Use variáveis ​​de ambiente para passar dados para seu script Python incorporado.

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html

usuário77115
fonte
1

usar no script:

echo $(python python_script.py arg1 arg2) > /dev/null

ou

python python_script.py "string arg"  > /dev/null

O script será executado sem saída.

tesoureiro
fonte
possível substituir "string arg" por uma variável que é de bash?
CodeGuru
1

Eu tenho um script bash que chama uma pequena rotina Python para exibir uma janela de mensagem. Como preciso usar killall para interromper o script Python, não posso usar o método acima, pois isso significaria executar killall python, que poderia remover outros programas Python, então eu uso

pythonprog.py "$argument"& # O & retorna o controle direto para o script bash, portanto, deve estar fora dos crases. A visualização desta mensagem está sendo exibida sem "` "nenhum dos lados do comando por algum motivo.

Contanto que o script python seja executado a partir do cli por nome em vez de python pythonprog.py, isso funciona dentro do script. Se precisar de mais de um argumento, basta usar um espaço entre cada um entre as aspas.

Dave Thebuskeruk
fonte
0

Imprima todos os args sem o nome do arquivo:

for i in range(1, len(sys.argv)):
print(sys.argv[i])
Riade
fonte
-1

e dê uma olhada no módulo getopt . Funciona muito bem para mim!

HappyHacking
fonte
the getopt docs start: Nota: O módulo getopt é um analisador para opções de linha de comando cuja API foi projetada para ser familiar aos usuários da função C getopt (). Os usuários que não estão familiarizados com a função getopt () C ou que gostariam de escrever menos código e obter melhor ajuda e mensagens de erro devem considerar o uso do módulo argparse.
cate