События Модуля Мерзавца Python? [закрытый]

5 ответов

Я думал, что отвечу на свой вопрос, так как я иду по другому пути, чем предложено в ответах. Тем не менее, спасибо тем, кто ответил.

Во-первых, краткий обзор моего опыта работы с GitPython, PyGit и Dulwich:

  • GitPython : После загрузки я импортировал это и инициализировал соответствующий объект. Однако попытка сделать то, что было предложено в руководстве, привела к ошибкам. Не имея дополнительной документации, я обратился в другое место.
  • PyGit : Это даже не импортируется, и я не смог найти никакой документации.
  • Dulwich : Кажется, это наиболее многообещающий (по крайней мере, для того, что я хотел и увидел). Я добился некоторого прогресса в этом, больше, чем в GitPython, поскольку его яйцо поставляется с исходным кодом Python. Однако через некоторое время я решил, что будет проще попробовать то, что я сделал.

Кроме того, StGit выглядит интересным, но мне бы понадобились функции, извлеченные в отдельный модуль, и я не хочу ждать, пока это произойдет прямо сейчас.

За (гораздо) меньшее время, чем я потратил на попытки получить три выше работающих модулей, мне удалось получить команды git, работающие через модуль подпроцесса, например

def gitAdd(fileName, repoDir):
    cmd = ['git', 'add', fileName]
    p = subprocess.Popen(cmd, cwd=repoDir)
    p.wait()

gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')

Это еще не полностью включено в мою программу, но я не предвижу проблемы, кроме, возможно, скорости (поскольку я буду обрабатывать сотни или даже тысячи файлов).

Возможно, у меня просто не хватило терпения наладить работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.

За (гораздо) меньшее время, чем я потратил на то, чтобы заставить работать три вышеуказанных модуля, мне удалось заставить команды git работать через модуль подпроцесса, например

def gitAdd(fileName, repoDir):
    cmd = ['git', 'add', fileName]
    p = subprocess.Popen(cmd, cwd=repoDir)
    p.wait()

gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')

Это еще не полностью включено в мою программу, но я я не предвижу проблемы, за исключением, может быть, скорости (так как я буду обрабатывать сотни или даже тысячи файлов время от времени).

Возможно, у меня просто не хватило терпения, чтобы начать работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.

За (гораздо) меньшее время, чем я потратил на то, чтобы заставить работать три вышеуказанных модуля, мне удалось заставить команды git работать через модуль подпроцесса, например

def gitAdd(fileName, repoDir):
    cmd = ['git', 'add', fileName]
    p = subprocess.Popen(cmd, cwd=repoDir)
    p.wait()

gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')

Это еще не полностью включено в мою программу, но я я не предвижу проблем, за исключением, может быть, скорости (поскольку я буду обрабатывать сотни или даже тысячи файлов время от времени).

Может быть, у меня просто не хватило терпения, чтобы начать работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.

время от времени я буду обрабатывать сотни или даже тысячи файлов.)

Возможно, мне просто не хватило терпения наладить работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.

время от времени я буду обрабатывать сотни или даже тысячи файлов.)

Возможно, мне просто не хватило терпения наладить работу с Dulwich или GitPython. Тем не менее, я надеюсь, что в ближайшее время модули получат дальнейшее развитие и станут более полезными.

73
ответ дан 23 November 2019 в 21:00
поделиться

Может быть, это и помогает, но Bazaar и Mercurial оба используют dulwich для взаимодействия с Git.

Dulwich, вероятно, отличается от другого в том смысле, что это повторная реализация git на python. Другой может быть просто оболочкой для команд Git (чтобы было проще использовать с точки зрения высокого уровня: фиксация / добавление / удаление), это, вероятно, означает, что их API очень близок к командной строке git, поэтому вам понадобится чтобы получить опыт работы с Git.

17
ответ дан 23 November 2019 в 21:00
поделиться

Часть библиотеки взаимодействия git в StGit на самом деле довольно хороша. Тем не менее, он не разбит на отдельный пакет, но я уверен, что при наличии достаточного интереса это можно исправить.

В нем есть очень хорошие абстракции для представления коммитов, деревьев и т. Д., А также для создания новых коммитов и деревьев .

0
ответ дан 23 November 2019 в 21:00
поделиться

JDBC API является отличным примером для этого. В этом пути драйвер JDBC можно настроить извне, например, в файле свойств

driver = com.dbvendor.jdbc.Driver
url = jdbc:dbvendor://localhost/dbname
username = stackoverflow
password = youneverguess

.. который можно использовать как

Properties properties = new Properties();
properties.load(Thread.currentThread().getResourceAsStream("jdbc.properties"));

String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");

Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);

Каждая реализация драйвера JDBC в основном регистрируется в DriverManager внутри статического блока инициализатора. Это именно тот, который выполняется во время Class # forName () .

package com.dbvendor.jdbc;

public class Driver implements java.sql.Driver {

    static {
         java.sql.DriverManager.registerDriver(new Driver());
    }

    private Driver() {
        // ...
    }

    public boolean acceptsURL(String url) {
        return url.startsWith("jdbc:dbvendor");
    }

}

Поскольку DriverManager примерно выглядит так (он фактически использует старомодный Vector )

private static final Set<Driver> drivers = new HashSet<Driver>();

public static void registerDriver(Driver driver) {
    drivers.add(driver);
}

public static Connection getConnection(String url, String username, String password) throws SQLException {
    for (Driver driver : drivers) {
        if (driver.acceptsURL(url)) {
            return driver.connect(url, username, password);
        }
    }
    throw new SQLException("No suitable driver");
}

... вы можете получить от него подключение без необходимости создания экземпляра самого драйвера!

В этом пути код JDBC является очень портативным. Можно изменить БД или распределить код между пользователями с различными БД без необходимости изменения/взлома/перестроения самого кода.

Этот подход используют не только JDBC, но и другие API, такие как Servlet API, ORM, такие как Hibernate/JPA, рамки ввода зависимостей и т.д. использует отражение для загрузки классов на основе настраиваемых извне файлов свойств, файлов конфигурации XML и/или аннотаций. Все это делает код более портативным и съемным.

-121--1732675-

Из моего опыта поведение статики, определенной в области файла, отличается от статики, определенной в функции

Область файла инициализируется безопасно до того, как все потоки переходят, область функции - нет.

Обратите внимание, что это, по-видимому, зависит от версий компилятора (которые вы ожидаете, учитывая, что мы идем в «неопределенных» областях поведения)

-121--3113862-

Для записи ни одна из вышеупомянутых библиотек Git Python, кажется, не содержит эквивалента «git status», что действительно единственное, что я хотел бы, поскольку работа с остальными командами git через подпроцессы так просто.

-3
ответ дан 23 November 2019 в 21:00
поделиться

Для полноты картины http://github.com/alex/pyvcs/ является слоем абстракции для всех DVD-дисков. Он использует Dulwich, но обеспечивает взаимодействие с другими DVD.

6
ответ дан 23 November 2019 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: