Моя работа: я хочу создать скрипт Python, который автоматически изменяет содержимое файла, а затем фиксирует изменение в Perforce.
Потому что файл сначала доступен только для чтения. Поэтому мне нужно создать скрипт Python, который
UpdateContent.cpp
#include <iostream>
#include <string>
#include <stream>
#include <vector>
using namespace std;
const string YearKeyword = "YEAR";
const string ResourceInfoFileName = "//depot/Include/Version.h";
int main()
{
fstream ReadFile;
ReadFile.open(ResourceInfoFileName);
if (ReadFile.fail())
{
cout << "Error opening file: " << ResourceInfoFileName << endl;
return 1;
}
vector<string> lines; // a vector stores content of all the lines of the file
string line; // store the content of each line of the file
while (getline(ReadFile, line)) // read each line of the file
{
if (line.find(YearKeyword) != string::npos)
{
line.replace(line.size() - 5, 4, "2023"); // update current year
}
lines.push_back(line); // move the content of that line into the vector
}
ReadFile.close();
// after storing the content (after correcting) of the file into vector, we write the content back to the file
ofstream WriteFile;
WriteFile.open(ResourceInfoFileName);
if (WriteFile.fail())
{
cout << "Error opening file: " << ResourceInfoFileName << endl;
return 1;
}
for (size_t i = 0; i < lines.size() ; i++)
{
WriteFile << lines[i] << endl;
}
WriteFile.close();
return 0;
}
UpdateResource.py
from P4 import P4, P4Exception
import subprocess
p4 = P4()
print('User ', p4.user, ' connecting to ', p4.port)
print('Current workspace is ', p4.client)
try:
p4.connect()
versionfile = '//depot/Include/Version.h'
p4.run( "edit", versionfile )
cmd = "UpdateContent.cpp"
subprocess.call(["g++", cmd]) // **THIS IS ERROR POSITION (line 24)**
subprocess.call("./UpdateContent.out")
change = p4.fetch_change()
change._description = "Update information"
change._files = versionfile
p4.run_submit( change )
p4.disconnect()
print('Disconnected from server.')
except P4Exception:
for e in p4.errors:
print(e)
print('Script finished')
Я поместил UpdateResource.py и UpdateContent.cpp в один и тот же каталог на диске N (N:/ResourceTools/), файл Version.h
, который нужно изменить, находится в другом каталоге.
Я получаю это сообщение, когда запускаю скрипт.
Я новичок в питоне, где я ошибаюсь?
Я думаю, из-за этой строки const string ResourceInfoFileName = "//depot/Include/Version.h";
в файле .cpp (возможно).
🤔 А знаете ли вы, что...
Python поддерживает множество парадигм программирования, включая процедурное, объектно-ориентированное и функциональное программирование.
Ошибка, с которой вы сталкиваетесь, выглядит как сбой установки g++
в вашей локальной системе.
Со стороны Perforce/P4Python самое простое решение — полностью отказаться от кода C++ и вместо этого добавить логику модификации файла в ваш скрипт Python, чтобы вам не нужно было компилировать приложение C++ на стороне (и беспокоиться о среде, в которой работает Python). скрипт работает, включая подходящий компилятор). Файловый ввод-вывод очень прост в Python, поэтому вы можете выполнить всю работу своего UpdateContent.cpp
приложения в четырех строках кода Python.
from P4 import P4
depot_path = '//depot/Include/Version.h'
p4 = P4()
print(f'User {p4.user} connecting to {p4.port}')
print(f'Current workspace is {p4.client}')
with p4.connect() as p4:
local_path = p4.run_have(depot_path)[0]['path']
p4.run_edit(local_path)
with open(local_path) as f:
lines = [line[:-5] + "2023\n" if "YEAR" in line else line for line in f]
with open(local_path, "w") as f:
f.writelines(lines)
p4.run_submit('-d', 'Update information', local_path)
print('Disconnected from server.')
print('Script finished')
Обратите внимание, что я скопировал реализацию вашего кода C++, который предполагает, что год — это последние четыре символа строки, содержащей ключевое слово YEAR
; вы могли бы легко сделать это более интеллектуальным с помощью (например) регулярного выражения или метода str.replace
.