90

github Webhook を使用して、変更をリモート開発サーバーにプルできるようにしたいと考えています。現時点では、適切なディレクトリにいるときに、git pull必要な変更を取得します。ただし、Python 内からその関数を呼び出す方法がわかりません。私は次のことを試しました:

import subprocess
process = subprocess.Popen("git pull", stdout=subprocess.PIPE)
output = process.communicate()[0]

しかし、これにより次のエラーが発生します

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

この bash コマンドを Python 内から呼び出す方法はありますか?

4

6 に答える 6

160

GitPython の使用を検討しましたか? このナンセンスをすべて処理するように設計されています。

import git 

g = git.cmd.Git(git_dir)
g.pull()

https://github.com/gitpython-developers/GitPython

于 2013-03-09T20:38:43.420 に答える
58

subprocess.Popenプログラム名と引数のリストが必要です。単一の文字列を渡します。これは(デフォルトでshell=False)次と同等です。

['git pull']

これは、 subprocess が文字通り という名前のプログラムを見つけようとしてgit pull失敗したことを意味します。Python 3.3 では、コードで例外が発生しますFileNotFoundError: [Errno 2] No such file or directory: 'git pull'。代わりに、次のようにリストを渡します。

import subprocess
process = subprocess.Popen(["git", "pull"], stdout=subprocess.PIPE)
output = process.communicate()[0]

ところで、Python 2.7 以降では、このコードをcheck_output便利な関数で簡略化できます。

import subprocess
output = subprocess.check_output(["git", "pull"])

また、git 機能を使用するために、git バイナリを呼び出す必要はまったくありません (単純で移植可能ですが)。git-pythonまたはDulwichの使用を検討してください。

于 2013-03-09T20:34:19.977 に答える
2

これは私のプロジェクトの 1 つで使用しているサンプル レシピです。ただし、これを行うには複数の方法があることに同意しました。:)

>>> import subprocess, shlex
>>> git_cmd = 'git status'
>>> kwargs = {}
>>> kwargs['stdout'] = subprocess.PIPE
>>> kwargs['stderr'] = subprocess.PIPE
>>> proc = subprocess.Popen(shlex.split(git_cmd), **kwargs)
>>> (stdout_str, stderr_str) = proc.communicate()
>>> return_code = proc.wait()

>>> print return_code
0

>>> print stdout_str
# On branch dev
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   file1
#   file2
nothing added to commit but untracked files present (use "git add" to track)

>>> print stderr_str

コードの問題は、配列を渡していないためsubprocess.Popen()、 という単一のバイナリを実行しようとしていたことgit pullです。git代わりに、最初の引数などでバイナリを実行する必要がpullあります。

于 2013-03-09T20:42:05.707 に答える
1

Python 3.5+ を使用している場合は、それが処理できるシナリオを好みsubprocess.runますsubprocess.Popen。例えば:

import subprocess
subprocess.run(["git", "pull"], check=True, stdout=subprocess.PIPE).stdout
于 2020-05-21T23:56:59.633 に答える
-2

試す:

subprocess.Popen("git pull", stdout=subprocess.PIPE, shell=True)
于 2013-03-09T20:41:28.613 に答える