Python3'subprocess.check_output'中的'cleartool find -print'返回空字符串

时间:2013-07-10 13:42:55

标签: python subprocess clearcase

我正在尝试使用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===

在shell上执行cleartool find命令时,将打印文件名

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

3 个答案:

答案 0 :(得分:2)

默认情况下,subprocess.Popenshell=Falsecheck_output函数将其参数传递给Popen,因此您在此处获得shell=False。在不调用shell的情况下,每个参数都会被解释为cleartool。当您从shell运行命令时:

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

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

答案 1 :(得分: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"]

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

案例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 - 精灵的双引号

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中没有抱怨。

答案 2 :(得分:0)

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

您需要确保Python子流程:

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

torek提到in the comments这个问题的一个更简单的原因:

  

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

请参阅his answer


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

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

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

首先要对你的Python脚本进行一次很好的测试:

  • cwd(当前工作目录)的打印
  • a cleartool lsvob(如果您在动态视图中,请参阅python子流程中的those vobs are still mounted)。