Argüman ile bash'dan Python betiğini çağırın


92

Aşağıdakileri kullanarak bash betiğimden bir python betiği çalıştırabileceğimi biliyorum:

python python_script.py

Ama ya bash betiğimden python betiğime bir değişken / argüman geçirmek istersem ne olur? Bunu nasıl yapabilirim?

Temelde bash bir dosya adı oluşturacak ve sonra python yükleyecek, ancak dosya adını çağırdığımda bash'den python'a göndermem gerekiyor.


python python_script.pyDebian'da varsayılan kabuğunuzda çalıştırdığınızda zaten bash kullanıyorsunuz ... bu yüzden sadece bash betiğinizde yapın:python python_script.py arg1 arg2 ...
Oz123

@Jimmy Hazırlanmamış Soru Sanırım, çok kolay Bağlantı: tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan

Yanıtlar:


134

Bir bash betiğinde bir python betiğini çalıştırmak için, bir terminalde yapacağınızla aynı komutu çağırmanız gerekir. Örneğin

> python python_script.py var1 var2

Bu değişkenlere python içinde erişmek için ihtiyacınız olacak

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

Teşekkürler. Ancak bu yol, python dosyasını yalnızca bir kullanım durumu için kısıtlar. Bash betikleri içinde dinamik parametrelerle bir python dosyasının yöntemlerini çağırmanın bir yolu var mı? Bu şekilde aynı python dosyasını kullanabileceğiz. Bunu bash betiği içinde $ var ile python dosya yöntemlerini çağırarak yapmaya çalıştım. Ama bir şekilde başarısız oldu.
burcak

@burcak Python dosyasını dinamik parametrelere göre paralel olarak yürütmek istiyorsanız, Önce tam yolu oluşturun << python komut dosyası konum yolu >> / << python komut dosyası adı >> param1 param2 | << python komut dosyası konum yolu >> / << python komut dosyası adı >> param3 param4, bash betiğinde, çıktıyı aşağıdaki python betiğine bir argüman olarak iletin, sys içe aktarma alt sürecini içe aktarın arg_str = "" .join (sys.argv [1:]) cmds = arg_str. cmd cinsinden cmd için bölme ('|'): print ('call -' + cmd) alt işlemi.Açık (cmd, shell = True) print ('çağrı cmds bitti')
Per

21

Kullanım

python python_script.py filename

ve Python betiğinizde

import sys
print sys.argv[1]

21

Ayrıca sys.argv, komut dosyaları için seçenekleri ve argümanları tanımlamaya yardımcı olan argparse modülüne de bir göz atın .

Argparse modülü, kullanıcı dostu komut satırı arayüzleri yazmayı kolaylaştırır.


Kabul ediyorum, bana göre argparse sys.argv'den çok daha iyi bir seçenek
Mo Ali

8

Gömülü seçenek:

Python kodunu bir bash işlevine sarın.

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

Verileri gömülü python betiğinize aktarmak için ortam değişkenlerini kullanın.

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

komut dosyasında kullanın:

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

veya

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

Komut dosyası çıktı olmadan yürütülecektir.


"string arg" yi bash'den gelen bir değişkenle değiştirmek mümkün mü?
CodeGuru

1

Bir mesaj penceresi görüntülemek için küçük bir python rutini çağıran bir bash betiğim var. Python betiğini durdurmak için killall kullanmam gerektiğinden, yukarıdaki yöntemi kullanamıyorum, çünkü bu, diğer python programlarını kaldırabilecek killall python çalıştırmak anlamına gelecektir, bu yüzden kullanıyorum

pythonprog.py "$argument"& # &, Denetimi doğrudan bash betiğine döndürür, bu nedenle geri işaretlerin dışında olmalıdır. Bu mesajın önizlemesi, bir nedenden ötürü komutun her iki yanında "` "olmadan gösteriyor.

Python betiği, python pythonprog.py yerine cli'den isme göre çalışacağı sürece bu, betik içinde çalışır. Birden fazla argümana ihtiyacınız varsa, tırnak içinde her biri arasında bir boşluk kullanın.


0

Dosya adı olmadan tüm bağımsız değişkenleri yazdırın:

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

-1

ve getopt modülüne bir göz atın . Benim için oldukça iyi çalışıyor!


getopt docs start: Not: getopt modülü, API'si C getopt () işlevinin kullanıcılarına aşina olacak şekilde tasarlanmış komut satırı seçenekleri için bir ayrıştırıcıdır. C getopt () işlevine aşina olmayan veya daha az kod yazmak ve daha iyi yardım ve hata mesajları almak isteyen kullanıcılar bunun yerine argparse modülünü kullanmayı düşünmelidir.
Cate
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.