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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2312閲覧

pythonコードからsubprocessを通してgit pullコマンドを実行すると「FileNotFoundError・・・:'git pull origin master'」が発生してしまう

Ksuke_O

総合スコア18

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/08/16 13:48

詳細

subprocessでgitコマンドを実行した際に表題のようなエラーがある為、困っています。

環境としまして、
デスクトップのWindowsPCと、VPSのubuntuを使用しております。
いずれもgitはインストール済みです。

まずWinPCで次のようなコードを作成しました。

■ディレクトリ構造

Project  L Tool1   L main.py   L sources    L api     L git_api.py    L controll.py  L Tool2  L Tool3

■今回実行する際の関連コード
・git_api.py

python

1def git(cmd): 2 proc = subprocess.Popen(cmd, stdin=-1, stdout=-1, stderr=-1) 3 out, err = proc.communicate() 4 5 if len(err) == 0: 6 print(out) 7 return out.strip() 8 else: 9 print(err.strip()) 10 11def pull(_brunch_name): 12 cmd = "git pull origin " + _brunch_name 13 git(cmd)

・controll.py

python

1git_api.pull("master")

以上のようなコードをgitのプライベートリポジトリにpushし、
VPSのubuntu上で「Project」をgitクローン後、「Tool1」ディレクトリの「python3 main.py」を実行すると、subprocessで「git pull origin master」を実行する際にエラーが発生します。

File "/home/ubuntu/Project/Tool1/sources/api/git_api.py", line 9, in git proc = subprocess.Popen(cmd, stdin=-1, stdout=-1, stderr=-1) File "/usr/local/lib/python3.8/subprocess.py", line 858, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/local/lib/python3.8/subprocess.py", line 1704, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'git pull origin master'

※一部省略

WinPC上で実行する分には問題ありません。
ubuntu上でgit pullを行う分にも問題がなく、pythonコードでsubprocessを通してgitコマンドが出来ないようです。
(コミットも同様のエラー)
エラー内容からgitファイルを見ることができないと思い、「Project」フォルダなどをPATHに追加してみても変化はなく、困っています。

どうか解決方法をご教示頂けませんでしょうか。

実現したいこと

エラーを修正してgitコマンドをpythonコードから実行したい

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

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

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

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

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

guest

回答2

0

端末から打って実行するそのままのコマンドラインを使いたいときは、シェル経由(デフォルトは/bin/sh)を使います。
この場合は文字列をそのまま指定します。(そのままと言っても、もちろん、文字列リテラルで書くために必要なエスケープは必要)

Python

1proc = subprocess.Popen(cmd, shell=True, stdin=-1, stdout=-1, stderr=-1)

投稿2022/08/17 00:02

otn

総合スコア84555

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

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

Ksuke_O

2022/08/17 10:43

shell=True はそういった機能だったんですね・・・ ありがとうございます! 勉強になりました。
guest

0

ベストアンサー

マニュアルを読みましょう。
https://docs.python.org/ja/3/library/subprocess.html#subprocess.Popen

args が文字列の場合、解釈はプラットフォーム依存であり、下記に説明されます。...特に明記されない限り、args をシーケンスとして渡すことが推奨されます。

POSIX 上では、args が文字列の場合、その文字列は実行すべきプログラムの名前またはパスとして解釈されます。しかし、これはプログラムに引数を渡さない場合にのみ可能です。

つまり、

python

1 cmd = ["git", "pull", "origin", _brunch_name]

とすることが推奨されてます。

投稿2022/08/16 14:17

編集2022/08/16 14:18
int32_t

総合スコア20884

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

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

Ksuke_O

2022/08/16 14:41

早速のご回答ありがとうございます。 回答頂いた内容のように修正し、無事git pullが出来ました。 subprocessの使い方が間違っていたんですね・・・ これを機に頂いたマニュアルをちゃんと読み確認したいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問