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.


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

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]

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.


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


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.


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.


0

Imprima todos os args sem o nome do arquivo:

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

-1

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.