1

我正在尝试使用 Python 子进程运行以下命令

/usr/atria/bin/cleartool find <path> -follow -name '*.elf' -version "lbtype(CXC1111-111)" -print

代码片段:

cmd = [clt, 'find', path, '-follow', '-name', '\"*.elf\"', '-version', lb, "-print"]
try:         
    output = subprocess.check_output(cmd)

    print("--%s--" % output)
    print("===DONE===")
except subprocess.CalledProcessError as e:
    print("CALLEDPROCESSERROR")
    print(e)
except subprocess.TimeoutExpired as e:
    print(e)

运行代码段后的 o/p

--b''--

===DONE===

cleartool findshell 上执行命令时,会打印文件名

理想情况下,python 脚本输出应该打印文件名。有什么想法会出错吗?

4

3 回答 3

2

默认情况下,subprocess.Popenshell=False. 该check_output函数将其参数传递给Popen,所以你也到了shell=False这里。在不调用 shell 的情况下,每个参数都会未经解释地传递给cleartool. 当您从 shell 运行命令时:

cleartool find ... -name '*.elf' -version "lbtype(CXC1111-111)" ...

(剪掉一些位以使其更适合窗口),单引号和双引号被外壳剥离,因此cleartool只得到*.elfand lbtype(CXC1111-111)。这些是您需要传递的字节序列shell=False。(保留shell=False可能是最好的;如果将其设置为,则True必须将命令粘贴到单个字符串中并引用 shell 元字符。)

于 2013-07-11T08:22:47.743 回答
1

我想我找到了问题所在。

在解决方案之前,这是我的 lb 和 cmd 的外观

lb = '\"lbtype(%s-%s)\"' % (tmp_prod_no, rev)
cmd = [clt, 'find', lm_path, '-follow', '-name', '\"*.elf\"', '-version', lb, "-print"]

\" 标签是问题的罪魁祸首经过修改(lb 和 *.elf)后,它工作正常

lb = 'lbtype(%s-%s)' % (tmp_prod_no, rev)
cmd = [clt, 'find', lm_path, '-follow', '-name', '*.elf', '-version', lb, "-print"]

有人可以解释 subprocess 如何处理命令中的引号。这是我尝试过的不同组合和错误

案例 1 - lb 和 elf 的双引号

lb = '\"lbtype(%s-%s)\"' % (tmp_prod_no, rev)
cmd = [clt, 'find', lm_path, '-follow', '-name', '\"*.elf\"', '-version', lb, "-print"]

o/p:
--b''--
===DONE===

案例 2 - elf 的双引号

lb = 'lbtype(%s-%s)' % (tmp_prod_no, rev)
cmd = [clt, 'find', lm_path, '-follow', '-name', '\"*.elf\"', '-version', lb, "-print"]    

o/p:
cleartool: Error: Syntax error in query (near character 1).
cleartool: Error: Invalid query: ""lbtype(CXC1727075-R78A12)""
cleartool: Warning: Skipping   \vobs/cello/babs/control_test_dm/jpre_test_lm/bin/jpre_test.ppc.elf".
CALLEDPROCESSERROR
Command '['/usr/atria/bin/cleartool', 'find',   '/vobs/cello/babs/control_test_dm/jpre_test_lm', '-follow', '-name', '*.elf', '-version', '"lbtype(CXC1727075-R78A12)"', '-print']' returned non-zero exit status 1

案例 3 - 没有双引号给出正确答案

lb = 'lbtype(%s-%s)' % (tmp_prod_no, rev)
cmd = [clt, 'find', lm_path, '-follow', '-name', '*.elf', '-version', lb, "-print"]

o/p:
--b'\vobs\asd\asd\adasd'--
===DONE===

为什么 clearcase 在案例 2 中抱怨 lbtype 而在案例 1 中却没有。

于 2013-07-11T08:10:38.450 回答
0

cleartool find正如我在“ ”先决条件中提到的,find必须从 ClearCase 视图(快照或动态)中执行;

您需要确保 Python 子进程:

  • 保持当前路径
  • 在该过程中安装了vob(如果您使用的是动态视图)。

torek在评论中提到了问题的一个更简单的原因:

各种子流程调用的默认值是shell=False

他的回答


如果您的路径(在 shell 上)是 /vobs,则尤其如此:这仅对已设置的视图有效,该视图会产生自己的进程。有关更多信息,请参阅“ Python 和 ClearCase setview ”。
它也不允许像 ' clt' 这样的别名起作用(' cleartool' 可能起作用,' clt' 不是:请参阅“ Clearcase running commands from a script (error: Bad phone number) ”作为示例)

使用所述动态视图的完整路径在动态视图中尝试:

/view/aView/vobs/aVob/...

一个好的测试是让你的 Python 脚本先做:

  • cwd(当前工作目录)的打印
  • a cleartool lsvob(查看,如果您在动态视图中,这些 vobs 是否仍安装在 python 子进程中)。
于 2013-07-10T14:20:49.097 回答