IT Share you

파이썬에서 어떻게 'git pull'을 호출 할 수 있습니까?

shareyou 2020. 11. 29. 12:39
반응형

파이썬에서 어떻게 'git pull'을 호출 할 수 있습니까?


github 웹훅을 사용하여 변경 사항을 원격 개발 서버로 가져올 수 있기를 바랍니다. 현재 적절한 디렉토리에있을 때 git pull필요한 변경 사항을 가져 옵니다 . 그러나 Python 내에서 해당 함수를 호출하는 방법을 알 수 없습니다. 나는 다음을 시도했다 :

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

그러나 이로 인해 다음과 같은 오류가 발생합니다.

역 추적 (최근 호출 마지막) : 파일 "", 줄 1, 파일 "/usr/lib/python2.7/subprocess.py", 줄 679, init errread, errwrite) 파일 "/ usr / lib / python2. 7 / subprocess.py ", 1249 행, _execute_child에서 child_exception 발생 OSError : [Errno 2] 해당 파일 또는 디렉토리가 없습니다.

Python 내에서이 bash 명령을 호출 할 수있는 방법이 있습니까?


GitPython 사용을 고려해 보셨습니까? 이 모든 말도 안되는 소리를 처리하도록 설계되었습니다.

import git 

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

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


subprocess.Popen프로그램 이름 및 인수 목록이 필요합니다. 다음과 같은 단일 문자열을 전달합니다 (기본값 사용 shell=False).

['git pull']

즉, 하위 프로세스는 문자 그대로라는 프로그램을 찾으려고 시도하지만 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 사용을 고려하십시오 .


GitPython을 사용하여 허용되는 답변 subprocess직접 사용하는 것보다 조금 낫습니다 .

이 접근 방식의 문제점은 출력을 구문 분석하려는 경우 결국 "porcelain"명령의 결과를 보게된다는 것입니다. 이는 나쁜 생각입니다.

이런 방식으로 GitPython을 사용하는 것은 반짝이는 새 도구 상자를 얻은 다음 내부 도구 대신 함께 고정하는 나사 더미에 사용하는 것과 같습니다. API를 사용하도록 설계된 방법은 다음과 같습니다.

import git
repo = git.Repo('Path/to/repo')
repo.remotes.origin.pull()

변경된 사항이 있는지 확인하려면 다음을 사용할 수 있습니다.

current = repo.head.commit
repo.remotes.origin.pull()
if current != repo.head.commit:
    print("It changed")

이것은 내 프로젝트 중 하나에서 사용하고있는 샘플 레시피입니다. 그래도 여러 가지 방법이 있다는 데 동의했습니다. :)

>>> 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

The problem with your code was, you were not passing an array for subprocess.Popen() and hence was trying to run a single binary called git pull. Instead it needs to execute the binary git with the first argument being pull and so on.


Try:

subprocess.Popen("git pull", stdout=subprocess.PIPE, shell=True)

참고URL : https://stackoverflow.com/questions/15315573/how-can-i-call-git-pull-from-within-python

반응형