Как открыть извлеченный файл P4 Python

В настоящее время я пишу скрипт на Python с API P4Python, который автоматизирует процесс проверки файла в Perforce и внесения в него некоторых изменений. В настоящее время я пытаюсь выяснить, как открыть извлеченный файл, чтобы внести в него изменения, но я не могу открыть его, используя путь к файлу //depot. Я бы предположил, что мне нужно использовать путь к системному файлу (C:/...), но я не уверен, как действовать дальше.

## Connect to P4 server
p4.connect()

## Checkout file to default changelist
p4.run_edit("//depot/file/tree/fileToEdit.txt")

f1 = "//depot/file/tree/fileToEdit.txt" ## This file path does not work

with open(f1, 'w') as file1:
    file1.write("THIS IS A TEST")

## Disconnect from P4 server
p4.disconnect()

person RayH99    schedule 18.09.2020    source источник


Ответы (2)


Функция Python open работает с локальными файлами и не имеет понятия о путях хранилища, поэтому, как вы говорите, вам нужно использовать путь к рабочей области. Удобно, что это возвращается как часть вывода p4 edit, поэтому вы можете просто взять его оттуда:

from P4 import P4

p4 = P4()

## Connect to P4 server
p4.connect()

## Checkout file to default changelist
local_paths = [
    result['clientFile'] 
    for result in p4.run_edit("//depot/file/tree/fileToEdit.txt")
]

for path in local_paths:
    with open(path, 'w') as f:
        f.write("THIS IS A TEST")

## Disconnect from P4 server
p4.disconnect()

Обратите внимание, что этот простой скрипт не будет работать в случае, когда команда p4 edit не открывает файл, например. если файл не синхронизирован (в этом случае, возможно, ваш скрипт хочет его p4 sync) или если файл уже открыт (в этом случае, возможно, вы просто хотите получить локальный путь от p4 opened и все равно изменить его - или, может быть, вы хотите сначала отменить существующие изменения или, возможно, вообще ничего не делать), или если файл не существует (в этом случае, возможно, вы захотите p4 add его вместо этого).

person Samwise    schedule 18.09.2020
comment
Привет, спасибо за ваш ответ! При реализации этого кода я столкнулся со следующей ошибкой: Файл .\P4Connect.py, строка 24, в ‹module› local_paths = [ Файл .\P4Connect.py, строка 25, в ‹listcomp› result['clientFile'] TypeError: строковые индексы должны быть целыми числами. Я пытался добавить целое число в раздел Result[], но позже это привело бы к ошибке разрешения при попытке открыть файл. - person RayH99; 22.09.2020
comment
Поскольку ваш первоначальный вопрос не включал весь ваш скрипт, я могу только догадываться, почему он работает по-другому для вас, но я предполагаю, что ваш скрипт отключает тегированный вывод, и поэтому run_edit дает вам список строк, а не список словари. Если это не так (исправление будет таким же простым, как удаление строки p4.tagged = False), то одним из первых шагов в отладке будет проверка значения result, чтобы узнать, что это за строка. - person Samwise; 23.09.2020
comment
Я взглянул на значение для печати (результат), и оно возвращает следующее: //depot/file/tree/fileToEdit.txt#23 — в настоящее время открыто для редактирования. Я не уверен, как я могу получить путь к системному файлу до этого момента, и, похоже, не так много документации по этому поводу. - person RayH99; 23.09.2020
comment
Как я уже сказал в своем ответе: этот простой скрипт не будет работать в случае, когда команда p4 edit не открывает файл. Вы наткнулись на дело, которое уже открыто. Выясните, что вы хотите, чтобы ваш скрипт делал в этом случае, и внесите соответствующие коррективы. - person Samwise; 23.09.2020
comment
Если бы я писал этот скрипт, я бы, вероятно, сделал несколько предварительных проверок с помощью p4 fstat, чтобы убедиться, что файл находится в ожидаемом состоянии (синхронизирован ли он с главной версией? Он уже открыт? Он вообще существует?) до того, как даже пытался открыть. Но я не знаю, какова общая цель сценария, поэтому, может быть, уместно просто вызвать исключение, если он не на пути к счастью? - person Samwise; 23.09.2020
comment
Файл синхронизируется с помощью p4.run_sync перед открытием для редактирования. Единственное, что мне нужно знать сейчас, это как я могу редактировать этот файл, который уже открыт. Конечная цель сценария — иметь возможность скопировать несколько строк из текстового файла на моем рабочем столе и записать их в файл, который в настоящее время извлечен и открыт для редактирования в принудительном порядке. - person RayH99; 23.09.2020
comment
Если вы заранее знаете, что файл уже открыт для редактирования, почему скрипт пытается открыть его для редактирования? Просто используйте p4 have, чтобы получить локальный путь, если вы его еще не знаете (хотя я не уверен, почему вы не знаете этого заранее, поскольку именно вы настроили рабочее пространство). - person Samwise; 23.09.2020
comment
Давайте продолжим обсуждение в чате. - person RayH99; 23.09.2020

Следующий фрагмент кода предоставил мне путь к локальному файлу:

result = p4.run_fstat("//depot/file/tree/fileToEdit.txt")[0]['clientFile']
print(result)

Использование p4.run_fstat(//depot/filename) предоставит всю необходимую информацию, дополнительный [0]['clientFile'] должен был получить путь к локальному файлу.

person RayH99    schedule 23.09.2020