Виклик сценарію Python з bash з аргументом


92

Я знаю, що можу запустити скрипт python зі свого сценарію bash, використовуючи наступне:

python python_script.py

Але як щодо того, якби я хотів передати змінну / аргумент своєму скрипту python зі свого скрипта bash. Як я можу це зробити?

В основному bash визначить ім'я файлу, а потім python завантажить його, але мені потрібно надіслати ім'я файлу з bash на python, коли я його викликаю.


під час виконання python python_script.pyу вашій оболонці за замовчуванням у Debian ви вже використовуєте bash ... так що просто зробіть у своєму скрипті bash:python python_script.py arg1 arg2 ...
Oz123

@Jimmy Unpapared Question Я думаю, це дуже просто Посилання: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Відповіді:


134

Щоб виконати скрипт python у сценарії bash, вам потрібно викликати ту саму команду, що і в терміналі. Наприклад

> python python_script.py var1 var2

Щоб отримати доступ до цих змінних у python, вам знадобиться

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2

Дякую. Однак цей спосіб обмежує файл python лише для одного випадку використання. Чи є спосіб викликати методи файлу python з динамічними параметрами всередині сценаріїв bash? Таким чином, ми зможемо використовувати той самий файл python. Я спробував зробити це за допомогою методів файлів python із $ var у скрипті bash. Але це якось не вдалося.
burcak

@burcak Якщо ви хочете виконати файл python паралельно на основі динамічних параметрів, спочатку побудуйте повний шлях << шлях розташування сценарію python >> / << назва сценарію python >> param1 param2 | << шлях розташування сценарію python >> / << ім'я сценарію python >> param3 param4 у скрипті bash, а потім передайте висновок як аргумент нижченаведеному сценарію python, імпортуйте sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. розкол ( '|') для ЦМДА в CMDS: друк ( 'виклик -' + CMD) subprocess.Popen (CMD, оболонки = True) друку ( 'CMDS виклику закінчено')
Тира

21

Використовуйте

python python_script.py filename

і у вашому сценарії Python

import sys
print sys.argv[1]

21

Крім того sys.argv, також погляньте на модуль argparse , який допомагає визначити параметри та аргументи для сценаріїв.

Модуль argparse дозволяє легко писати зручні інтерфейси командного рядка.


Я згоден, для мене argparse - це набагато кращий варіант, ніж sys.argv
Мо Алі

8

Вбудований варіант:

Оберніть код python у функцію 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

Використовуйте змінні середовища для передачі даних у ваш вбудований скрипт python.

#!/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

використання в сценарії:

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

або

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

Сценарій буде виконаний без вихідних даних.


можна замінити "рядок arg" змінною, яка є з bash?
CodeGuru

1

У мене є скрипт bash, який викликає невелику підпрограму python для відображення вікна повідомлення. Оскільки мені потрібно використовувати killall, щоб зупинити скрипт python, я не можу використовувати вищезазначений метод, оскільки це означало б запуск killall python, який міг би вивести інші програми python, тому я використовую

pythonprog.py "$argument"& # Елемент керування & повертає прямо до скрипта bash, тому він повинен знаходитися поза зворотними позначками. Попередній перегляд цього повідомлення з якихось причин відображає його без будь-якої сторони команди.

Поки скрипт python буде виконуватися з cli по імені, а не python pythonprog.py, це працює в сценарії. Якщо вам потрібно більше одного аргументу, просто використовуйте пробіл між кожним у лапках.


0

Роздрукувати всі аргументи без імені файлу:

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

-1

і подивіться на модуль getopt . Для мене це працює непогано!


починаються документи getopt : Примітка: Модуль getopt - це синтаксичний аналізатор параметрів командного рядка, API якого призначений для знайомства з користувачами функції C getopt (). Користувачам, які не знайомі з функцією C getopt () або які хотіли б написати менше коду та отримати кращу допомогу та повідомлення про помилки, слід натомість використовувати модуль argparse.
кейт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.