简体   繁体   English

如何在python中查看perforce中的文件?

[英]How do I check out a file from perforce in python?

I would like to write some scripts in python that do some automated changes to source code. 我想在python中编写一些脚本,对源代码进行一些自动更改。 If the script determines it needs to change the file I would like to first check it out of perforce. 如果脚本确定需要更改文件,我想首先将其从perforce中检出。 I don't care about checking in because I will always want to build and test first. 我不关心办理登机手续,因为我总是想先建立和测试。

Perforce has Python wrappers around their C/C++ tools, available in binary form for Windows, and source for other platforms: Perforce有围绕其C / C ++工具的Python包装器,以二进制形式提供给Windows,以及其他平台的源:

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

You will find their documentation of the scripting API to be helpful: 您会发现他们的脚本API文档很有帮助:

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

Use of the Python API is quite similar to the command-line client: 使用Python API与命令行客户端非常相似:

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.']
>>> 

I'll verify it from the command line: 我将从命令行验证它:

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

Here's what I came up with: 这是我想出的:

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

Perforce's P4 Python module mentioned in another answer is the way to go, but if installing this module isn't an option you can use the -G flag to help parse p4.exe output: 另一个答案中提到的Perforce的P4 Python模块是要走的路,但是如果安装这个模块不是一个选项,你可以使用-G标志来帮助解析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.

Building from p4python source requires downloading and extracting the p4 api recommended for that version. 从p4python源构建需要下载并解压缩为该版本推荐的p4 api。 For example, if building the Windows XP x86 version of P4Python 2008.2 for activepython 2.5: 例如,如果为activepython 2.5构建适用于P4Python 2008.2的Windows XP x86版本:

  • download and extract both the p4python and p4api 下载并解压缩p4pythonp4api
  • fixup the setup.cfg for p4python to point to the p4api directory. 修复p4python的setup.cfg以指向p4api目录。

To open files for edit (do a checkout), on the command line, see 'p4 help open'. 要打开要编辑的文件(执行检出),请在命令行上查看“p4 help open”。

You can check out files without making a changelist if you add the file to the default changelist, but it's a good idea to make a changelist first. 如果将文件添加到默认更改列表,则可以在不创建更改列表的情况下签出文件,但最好先制作更改列表。

P4Python doesn't currently compile for activepython 2.6 without visual studio 2008; P4Python目前没有为visual studio 2008编译activepython 2.6; the provided libs are built with 2005 or 2003. Forcing p4python to build against mingw is nearly impossible, even with pexports of python26.dll and reimp/reassembly of the provided .lib files into .a files. 提供的库是使用2005或2003构建的。强制p4python构建针对mingw几乎是不可能的,即使使用python26.dll的pexport和提供的.lib文件的reimp / reassembly到.a文件中也是如此。

In that case, you'll probably rather use subprocess, and return p4 results as marshalled python objects. 在这种情况下,您可能宁愿使用子进程,并将p4结果作为编组的python对象返回。 You can write your own command wrapper that takes an arg array, constructs and runs the commands, and returns the results dictionary. 您可以编写自己的命令包装器,它接受一个arg数组,构造并运行命令,并返回结果字典。

You might try changing everything, testing, and on success, opening the files that are different with something equivalent to 'p4 diff -se //...' 您可以尝试更改所有内容,测试并成功,打开与“p4 diff -se // ...”等效的文件不同的文件

You may want to check out the P4Python module. 您可能想要查看P4Python模块。 It's available on the perforce site and it makes things very simple. 它可以在perforce站点上使用,它使事情变得非常简单。

Remember guys to install the development package for Python for the p4api or it will complain about missing headers. 记住要为p4api安装Python的开发包,否则它会抱怨缺少标题。 In Ubuntu 10.10, just do a simple: 在Ubuntu 10.10中,只需做一个简单的操作:

apt-get install python2.6-dev

Or 要么

apt-get install python3.1-dev

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM