質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

2961閲覧

長いshellスクリプトをpyhtonのsubprocessで実行するやり方

trafalbad

総合スコア303

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2021/12/09 14:51

編集2021/12/09 14:52

下のような行間を挟んだ長いshellコマンド(run.sh)があります。

これをpythonのsubprocessで実行したいのですが、行間があるためうまくsubprocessの中に組み込めません。

run.sh

zsh

1#!/bin/sh 2CLAESES=1 3FIL=$(( (CLAESES+5)*3 )) 4rm cfg/yolov4.cfg 5cp cfg/src-yolov4.cfg cfg/yolov4.cfg 6mv cfg/yolov4.cfg cfg/yolov4.cfg.bak 7cat cfg/yolov4.cfg.bak | sed -e "s/filters=255/filters=${FIL}/g" -e "s/classes=80/classes=${CLAESES}/g" > cfg/yolov4.cfg 8rm cfg/*bak

python

1import subprocess 2com = ["CLAESES=1", "rm", "cfg/yolov4.cfg", "cp", "cfg/src-yolov4.cfg", "cfg/yolov4.cfg"] 3subprocess.run(com) 4>>>> 5 restore_signals, start_new_session) 6 File "/opt/anaconda3/lib/python3.6/subprocess.py", line 1364, in _execute_child 7 raise child_exception_type(errno_num, err_msg, err_filename) 8FileNotFoundError: [Errno 2] No such file or directory: 'CLAESES=1': 'CLAESES=1'

長い上のshellコマンドをpythonのsubprocessで実行する方法を教えていただけないでしょうか?よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

いろいろsubprocessの使い方の間違いを見ましたが、

com = ["CLAESES=1", "rm", "cfg/yolov4.cfg", "cp", "cfg/src-yolov4.cfg", "cfg/yolov4.cfg"]

は初めてのパターンですね。shell=Trueでないrunの引数では何を指定すると思っていたのでしょうか。

シェルの機能を使う時は、shell=Trueが必要です。
で、シェルのコマンドラインを文字列で与えます。改行は\nです。または;で区切っても良いです。

簡単な例:

Python

1subprocess.run("A=123\necho $A",shell=True) 2or 3subprocess.run("A=123;echo $A",shell=True)

今回は行数が多いので、'''という文字列記法を使いましょう。もちろん\nを挟みながら書いても良いのですが。

Python

1subprocess.run(''' 2CLAESES=1 3FIL=$(( (CLAESES+5)*3 )) 4rm cfg/yolov4.cfg 5cp cfg/src-yolov4.cfg cfg/yolov4.cfg 6mv cfg/yolov4.cfg cfg/yolov4.cfg.bak 7cat cfg/yolov4.cfg.bak | sed -e "s/filters=255/filters=${FIL}/g" -e "s/classes=80/classes=${CLAESES}/g" > cfg/yolov4.cfg 8rm cfg/*bak 9''',shell=True)

投稿2021/12/09 17:50

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trafalbad

2021/12/09 22:04

できました、ありがとうございます
otn

2021/12/09 23:51

shell=Trueでない場合に実行できるのは単一のコマンドで、 [ ~~ ] で指定するのは、 [コマンドのパス, 第一引数, 第二引数, 第三引数, ...] です。
guest

0

既にrun.shのスクリプトを作成済みですので,

python

1import subprocess 2com = ['/bin/sh', 'run.sh'] 3subprocess.run(com)

でいいのではないでしょうか?

投稿2021/12/09 15:12

ujimushi_sradjp

総合スコア2152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問