2016-04-04 12 views
0

Open Build Serviceプロジェクトにnpmパッケージの依存関係を追加するプロセスを自動化するPythonスクリプトを書いてみたいと思います。私は、シェルの機能を持っている:Pythonのシェル関数に変数を渡すにはどうしたらいいですか?

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

が、これは現時点で私が持っているPythonスクリプト(インポートされるpackage.jsonファイルがNPMパッケージの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") 

私が合格したいと思いますkeyシェル変数cpobsnの変数です(つまり、このPythonループですべての繰り返しでシェルコマンドcpobsn keyを実行します)。これはどうすればいいですか?

+1

['subprocess'](https://docs.python.org/3/library/subprocess.html)モジュールを見てください – Finwood

答えて

1

機能は、インタラクティブな使用に適していますが、これはあなたの代わりに、スタンドアロンスクリプトをしたい場合のように思えます。

.zshrcなどにロードできる関数を用意したい場合は、スクリプトファイルにPython __name__ == '__main__'イディオムのようなことを行うこともできます。しかし、ファイルの名前をコマンドの名前に変更して機能を取り除くことは、ここで最終目標を達成する最も簡単な方法のように思えます。

たとえば、$HOME/bin/cpobsnchmod +xのように保存します。あなたのPATHにも$HOME/binが含まれていることを確認してください。

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

(良い測定のための適切な引用符の追加を注意してください。)

さて、あなたは任意の正規外部コマンドと同様に、Pythonのからそれを呼び出すことができます。

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

subprocess.call()subprocess.check_call()の間の選択は、スクリプトが便利な終了コードを返すかどうかに依存します。それは現時点ではないので、実際にはcallで十分でしょう。一方、修正する必要があります。check_callを使用して、シェルスクリプトの一部が失敗したときにPythonから通知されるようにしてください。

最小限でも、set -eをシェルスクリプトに追加すると、エラーをチェックし、何かが失敗した場合は中止します。これはリファクタリングを必要とすることが多く、致命的ではないエラー(結果を返さないgrep - これは技術的にはエラーですが、しばしば正常なフローの受け入れ可能な部分です)で終了しないようにします。

-1

os.systemにもキーを入力してください。 os.systemとPythonの文字列の連結を使用して

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

' os.system( "cpobsn"、key)を返す '' TypeError :system()は最大で1つの引数(与えられた2つ)をとります。 – BH2017

+0

私の謝罪、これはそれを修正したはずです。 – Koga

+0

他に何か必要ですか? – Koga

0

は偉大なセキュリティ上のリスクがある、例えばキー"foo; rm -rf /"は、すべてのファイルを削除します。

Pythonのsubprocessモジュールは、この使用のためにはるかに適しています:

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

パーミッションのエラー、つまりこのエラーが返されたのでなければ、それは素晴らしいでしょう:http://paste2.org/vDmHmHN4。 – BH2017

+0

まず、 'chmod'を使ってスクリプトに適切な権限を与える必要があります。 – Koga

+0

'cpobsn'はファイルではなくシェル関数です。だから私はこれがうまくいかないと思う。 – miracle173