2016-04-04 13 views
0

Bir Npm paketinin bağımlılıklarını Open Build Service projeme ekleme işlemlerini otomatikleştirmek için bir Python komut dosyası yazmak istiyorum.Değişkenleri Python'da kabuk işlevlerine nasıl geçiririm?

function cpobsn { 
    cdobsa 
    mkdir nodejs-$1 
    cd nodejs-$1 
    npm2PKGBUILD $1 > PKGBUILD 
    cpserv 
    obsa 
} 

bu şu anda var Python komut dizisidir (ithal edilen package.json dosyasıdır npm paketinin package.json):

import json 
import os 

with open("/home/fusion809/OBS/home:fusion809:arch_extra/arch-wiki-man/package/package.json") as json_file: 
    json_data = json.load(json_file) 
    deps = json_data["dependencies"] 
    for key, value in deps.items(): 
     print(key) 
     os.system("cpobsn") 

ben geçmek istiyorum ben bir kabuk fonksiyonu var key değişkeni cpobsn kabuk işlevine (yani, her bir yinelemede cpobsn key kabuk komutunu çalıştırmak için bu Python döngüsünü istiyorum). Bunu nasıl yaparım?

+1

['subprocess'] (https://docs.python.org/3/library/subprocess.html) modülüne bakın – Finwood

cevap

1

Fonksiyonlar interaktif kullanım için iyi, ama bu yerine tek başına bir senaryo istiyorum bir vaka gibi görünüyor:

Python'un subprocess modülü çok daha uygun bu kullanım içindir.

Eğer bir işleve sahip olmak istiyorsanız, .zshrc ya da benzeri birime yükleyebilirsiniz, komut dosyasında da Python __name__ == '__main__' deyim gibi bir şey yapabilirsiniz. Ancak dosyayı yeniden adlandırmak ve bu işlevin kurtulmasını sağlamak, son hedefinize ulaşmanın en kolay yolu gibi görünecektir.

Bunu, $HOME/bin/cpobsn ve chmod +x olarak kaydedin. $HOME/bin'un da PATH numaralı telefon hattında olduğundan emin olun.

#!/bin/sh 
cdobsa 
mkdir nodejs-"$1" 
cd nodejs-"$1" 
npm2PKGBUILD "$1" > PKGBUILD 
cpserv 
obsa 

(iyi ölçmek için uygun tırnak eklenmesini unutmayın.)

Şimdi, herhangi bir düzenli harici komutuyla olarak, Python onu çağırabilir.

from subprocess import check_call 
check_call(['cpobsn', key]) 

subprocess.call() ve subprocess.check_call() arasında seçim komut yararlı bir çıkış kodu döndürür olmadığına bağlıdır. Şu anda değil, aslında call yeterli olurdu; diğer yandan, bunu düzeltmeniz ve kabuk komut dosyasının bir kısmı başarısız olduğunda Python'un size bildirmesi için check_call kullanmanız gerekir.

Kabuk betiğine set -e eklenmesi en azında hata olup olmadığını kontrol eder ve herhangi bir şey başarısız olursa iptal eder; Ancak bu genellikle, ölümcül olmayan hataların sonlandırılmasından kaçınmak için yeniden düzenleme yapılmasını gerektirir (grep sonuca dönmemesi gibi - bu teknik olarak bir hatadır, ancak genellikle normal akışın kabul edilebilir bir parçasıdır).

-1

Sadece giriş anahtarı os.system'a girin. os.system ile

import json 
import os 

with open("/home/fusion809/OBS/home:fusion809:arch_extra/arch-wiki-man/package/package.json") as json_file: 
    json_data = json.load(json_file) 
    deps = json_data["dependencies"] 
    for key, value in deps.items(): 
     print(key) 
     os.system("cpobsn" + " " + key) 
+0

Geri döndürme sistemi os.system (" cpobsn ", anahtar)" return "TypeError : sistem() en fazla 1 argüman alır (2 verilen). – BH2017

+0

Özür dilerim, bunu düzeltmiş olmalı. – Koga

+0

İhtiyacınız olan başka bir şey var mı? – Koga

0

Python dize birleştirme kullanarak büyük bir güvenlik riski oluşturuyor, örneğin bir anahtar "foo; rm -rf /" tüm dosyaları silmek olacaktır.

from subprocess import call 
call(['cpobsn', key]) 
+0

Bu hata, yani hatalar, yani bu hata döndüren için olmasaydı harika olurdu: http://paste2.org/vDmHmHN4. – BH2017

+0

Öncelikle 'chmod' komutunu kullanarak komut dosyasına uygun izinleri vermelisiniz. – Koga

+0

'cpobsn' bir kabuk işlevi değil, bir dosyadır. Bu yüzden işe yaramayacağını düşünüyorum. – miracle173

İlgili konular