Panggil skrip Python dari bash dengan argumen

92

Saya tahu bahwa saya dapat menjalankan skrip python dari skrip bash saya menggunakan yang berikut ini:

python python_script.py

Tetapi bagaimana jika saya ingin meneruskan variabel / argumen ke skrip python saya dari skrip bash saya. Bagaimana saya bisa melakukan itu?

Pada dasarnya bash akan membuat nama file dan kemudian python akan mengunggahnya, tetapi saya perlu mengirim nama file dari bash ke python ketika saya memanggilnya.

Jimmy
sumber
ketika dijalankan python python_script.pydi shell default Anda di Debian, Anda sudah menggunakan bash ... jadi lakukan saja di skrip bash Anda:python python_script.py arg1 arg2 ...
Oz123
@Jimmy Unprepared Question Saya pikir, Linknya sangat mudah: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Jawaban:

134

Untuk menjalankan skrip python dalam skrip bash Anda perlu memanggil perintah yang sama dengan yang Anda lakukan di dalam terminal. Contohnya

> python python_script.py var1 var2

Untuk mengakses variabel ini di dalam python, Anda perlu

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2
duckman_1991
sumber
Terima kasih. Namun cara ini membatasi file python hanya untuk satu kasus penggunaan. Apakah ada cara untuk memanggil metode file python dengan parameter dinamis dalam skrip bash? Dengan cara ini, kita bisa menggunakan file python yang sama. Saya mencoba melakukan ini dengan metode file panggilan python dengan $ var dalam skrip bash. Tapi entah bagaimana gagal.
burcak
@burcak Jika Anda ingin mengeksekusi file python secara paralel berdasarkan parameter dinamis, Pertama buat jalur lengkap << jalur lokasi skrip python >> / << nama skrip python >> param1 param2 | << jalur lokasi skrip python >> / << nama skrip python >> param3 param4 di skrip bash, lalu berikan output sebagai argumen ke skrip python di bawah ini, impor sys import subprocess arg_str = "" .join (sys.argv [1:]) cmds = arg_str. split ('|') untuk cmd dalam cmds: print ('call -' + cmd) subprocess. Open (cmd, shell = True) print ('call cmds finish')
Thiru
21

Menggunakan

python python_script.py filename

dan dalam skrip Python Anda

import sys
print sys.argv[1]
NPE
sumber
21

Selain itu sys.argv, lihat juga modul argparse , yang membantu menentukan opsi dan argumen untuk skrip.

Modul argparse membuatnya mudah untuk menulis antarmuka baris perintah yang mudah digunakan.

miku
sumber
Saya setuju, bagi saya argparse adalah pilihan yang jauh lebih baik daripada sys.argv
Mo Ali
8

Opsi tersemat:

Bungkus kode python dalam fungsi 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

Gunakan variabel lingkungan, untuk meneruskan data ke skrip python tertanam Anda.

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

pengguna77115
sumber
1

gunakan dalam skrip:

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

atau

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

Skrip akan dijalankan tanpa keluaran.

burseaner
sumber
mungkin untuk mengganti "string arg" dengan variabel yang berasal dari bash?
CodeGuru
1

Saya memiliki skrip bash yang memanggil rutinitas python kecil untuk menampilkan jendela pesan. Karena saya perlu menggunakan killall untuk menghentikan skrip python, saya tidak dapat menggunakan metode di atas karena itu berarti menjalankan killall python yang dapat mengambil program python lain jadi saya gunakan

pythonprog.py "$argument"& # Kontrol & mengembalikan langsung ke skrip bash jadi harus berada di luar backticks. Pratinjau pesan ini menunjukkannya tanpa "` "di kedua sisi perintah karena alasan tertentu.

Selama skrip python akan dijalankan dari cli dengan nama daripada python pythonprog.py ini berfungsi di dalam skrip. Jika Anda membutuhkan lebih dari satu argumen, cukup gunakan spasi di antara setiap argumen di dalam tanda kutip.

Dave Thebuskeruk
sumber
-1

dan lihat modul getopt . Ini bekerja cukup baik untuk saya!

HappyHacking
sumber
dok getopt start: Catatan: Modul getopt adalah parser untuk opsi baris perintah yang API-nya dirancang agar terbiasa dengan pengguna fungsi C getopt (). Pengguna yang tidak terbiasa dengan fungsi C getopt () atau yang ingin menulis lebih sedikit kode dan mendapatkan bantuan yang lebih baik serta pesan kesalahan sebaiknya mempertimbangkan untuk menggunakan modul argparse.
cate