Как вызвать функцию .cpp внутри скрипта p4python?

Моя работа: я хочу создать скрипт Python, который автоматически изменяет содержимое файла, а затем фиксирует изменение в Perforce.

Потому что файл сначала доступен только для чтения. Поэтому мне нужно создать скрипт Python, который

  1. проверить файл (чтобы отредактировать его)
  2. вызовите UpdateContent.cpp, чтобы изменить содержимое этого файла
  3. зафиксировать изменение

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 поддерживает множество парадигм программирования, включая процедурное, объектно-ориентированное и функциональное программирование.


52
1

Ответ:

Решено

Ошибка, с которой вы сталкиваетесь, выглядит как сбой установки 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.