2008-10-08 7 views
14

Me gustaría escribir algunos scripts en python que realicen algunos cambios automáticos en el código fuente. Si la secuencia de comandos determina que necesita cambiar el archivo, me gustaría comprobarlo por primera vez. No me importa registrarme porque siempre querré construir y probar primero.¿Cómo puedo consultar un archivo forzosamente en python?

+0

estoy poniendo esto aquí para que pueda buscar en el futuro :) –

+1

@ Matt Precio - Creo que es lo que el la característica de pregunta favorita es para :). – swilliams

Respuesta

20

Perforce tiene envolturas de Python alrededor de sus herramientas de C/C++, disponible en formato binario para Windows, y fuente para otras plataformas:

http://www.perforce.com/perforce/loadsupp.html#api

Usted se encuentre la documentación de la API de secuencias de comandos para ser útil:

http://www.perforce.com/perforce/doc.current/manuals/p4script/p4script.pdf

el uso de la API de Python es bastante similar al cliente de línea de comandos:

PythonWin 2.5.1 (r251:54863, May 1 2007, 17:47:05) [MSC v.1310 32 bit (Intel)] on win32. 
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information. 
>>> import P4 
>>> p4 = P4.P4() 
>>> p4.connect() # connect to the default server, with the default clientspec 
>>> desc = {"Description": "My new changelist description", 
...   "Change": "new" 
...   } 
>>> p4.input = desc 
>>> p4.run("changelist", "-i") 
['Change 2579505 created.'] 
>>> 

voy a verificarlo desde la línea de comandos:

P:\>p4 changelist -o 2579505 
# A Perforce Change Specification. 
# 
# Change:  The change number. 'new' on a new changelist. 
# Date:  The date this specification was last modified. 
# Client:  The client on which the changelist was created. Read-only. 
# User:  The user who created the changelist. 
# Status:  Either 'pending' or 'submitted'. Read-only. 
# Description: Comments about the changelist. Required. 
# Jobs:  What opened jobs are to be closed by this changelist. 
#    You may delete jobs from this list. (New changelists only.) 
# Files:  What opened files from the default changelist are to be added 
#    to this changelist. You may delete files from this list. 
#    (New changelists only.) 

Change: 2579505 

Date: 2008/10/08 13:57:02 

Client: MYCOMPUTER-DT 

User: myusername 

Status: pending 

Description: 
     My new changelist description 
7

Esto es lo que ocurrió:

import os 

def CreateNewChangeList(description): 
    "Create a new changelist and returns the changelist number as a string" 
    p4in, p4out = os.popen2("p4 changelist -i") 
    p4in.write("change: new\n") 
    p4in.write("description: " + description) 
    p4in.close() 
    changelist = p4out.readline().split()[1] 
    return changelist 

def OpenFileForEdit(file, changelist = ""): 
    "Open a file for edit, if a changelist is passed in then open it in that list" 
    cmd = "p4 edit " 
    if changelist: 
     cmd += " -c " + changelist + " " 
    ret = os.popen(cmd + file).readline().strip() 
    if not ret.endswith("opened for edit"): 
     print "Couldn't open", file, "for edit:" 
     print ret 
     raise ValueError 
+1

Parece absurdo utilizar las llamadas a os.popen() cuando puede utilizar la API/herramientas nativas admitidas por Perforce. –

+4

El uso del módulo p4 lo vincula a una versión específica de la API obligatoria de C++ si no recuerdo mal. El uso de la línea de comando es compatible con versiones anteriores, es fácil, y si cambia el comando a p4 -G edit, devolverá los objetos como objetos de diccionario de Python marshalled. – grieve

+0

El uso de la línea de comando p4 también es más fácil de configurar – justinhj

2

Es posible que desee comprobar hacia fuera el módulo P4Python. Está disponible en el sitio forzado y hace las cosas muy simples.

4

Perforce's P4 Python module mencionado en otra respuesta es el camino a seguir, pero si la instalación de este módulo no es una opción que puede utilizar la bandera -G para ayudar a analizar la salida p4.exe:

p4 [ options ] command [ arg ... ] 
    options: 
      -c client -C charset -d dir -H host -G -L language 
      -p port -P pass -s -Q charset -u user -x file 
    The -G flag causes all output (and batch input for form commands 
    with -i) to be formatted as marshalled Python dictionary objects. 
3

construcción de la fuente p4python requiere descargar y extraer el API P4 recomendado para esa versión. Por ejemplo, si la construcción de la versión de Windows XP x86 de P4Python 2008.2 para ActivePython 2.5:

  • descarga y extraer tanto la corrección p4python y p4api
  • la setup.cfg para p4python a punto al directorio p4api.

Para abrir archivos para editar (hacer un checkout), en la línea de comandos, ver 'p4 help open'.

Puede ver los archivos sin hacer una lista de cambios si agrega el archivo a la lista de cambios predeterminada, pero es una buena idea hacer primero una lista de cambios.

P4Python actualmente no compila para activepython 2.6 sin visual studio 2008; las librerías proporcionadas están compiladas con 2005 o 2003. Forzar a p4python a construir contra mingw es casi imposible, incluso con pexports de python26.dll y volver a montar/reensamblar los archivos .lib proporcionados en archivos .a.

En ese caso, probablemente prefiera utilizar el subproceso y devolver los resultados de p4 como objetos de pitón estructurados. Puede escribir su propia envoltura de comando que toma una matriz arg, construye y ejecuta los comandos, y devuelve el diccionario de resultados.

Puede intentar cambiar todo, probar y, con éxito, abrir los archivos que son diferentes con algo equivalente a 'p4 diff -se // ...'

2

Recuerde chicos para instalar el paquete de desarrollo para Python para el p4api o se quejará de los encabezados que faltan. En Ubuntu 10.10, acaba de hacer un simple:

apt-get install python2.6-dev 

O

apt-get install python3.1-dev 
Cuestiones relacionadas