2024-05-16 00:23:53 发布
网友
我尝试使用Python子进程运行以下命令
/usr/atria/bin/cleartool find <path> -follow -name '*.elf' -version "lbtype(CXC1111-111)" -print
代码段:
运行代码段后执行o/p
--b''-- ===DONE===
在shell上执行cleartool find命令时,将打印文件名
cleartool find
理想情况下,python脚本输出应该打印文件名。 有什么问题吗?在
默认情况下,subprocess.Popen有{}。check_output函数将其参数传递给Popen,因此这里也得到了{}。在不调用shell的情况下,每个参数都被无意识地传递给cleartool。从shell运行时,命令:
subprocess.Popen
check_output
Popen
cleartool
cleartool find ... -name '*.elf' -version "lbtype(CXC1111-111)" ...
(为使其在窗口中更适合,截断了位),单引号和双引号被shell去掉,这样cleartool只得到*.elf和{}。这些是您需要通过shell=False传递的字节序列。(保留shell=False可能是最好的;如果将其设置为True,则必须将命令粘贴到单个字符串中并引用shell元字符。)
*.elf
shell=False
True
正如我在“^{}”先决条件中提到的,必须从ClearCase视图(快照或动态视图)中执行find
find
您需要确保Python子进程:
torek提到了in the comments这个问题的一个更简单的原因:
The default for the various subprocess invocations is shell=False
见his answer。在
如果路径(在shell上)是/vobs:。请参见“Python and ClearCase setview”了解更多信息。 它也不允许像'clt'这样的别名工作('cleartool'可能有用,'clt'不:请看“Clearcase running commands from a script (error: Bad phone number)”作为示例)
clt
使用所述动态视图的完整路径在动态视图中尝试:
/view/aView/vobs/aVob/...
一个好的测试方法是首先测试Python脚本:
cwd
cleartool lsvob
我想我已经解决了这个问题。在
在解决方案之前,这里是我的lb和cmd的外观
lb = '\"lbtype(%s-%s)\"' % (tmp_prod_no, rev) cmd = [clt, 'find', lm_path, '-follow', '-name', '\"*.elf\"', '-version', lb, "-print"]
“标签是问题的罪魁祸首 经过以下修改(lb和*.elf),它可以正常工作
有人能解释一下子进程如何在命令中处理引号吗。 以下是我尝试过的不同组合和错误
案例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中。在
默认情况下,}。}。在不调用shell的情况下,每个参数都被无意识地传递给
subprocess.Popen
有{check_output
函数将其参数传递给Popen
,因此这里也得到了{cleartool
。从shell运行时,命令:(为使其在窗口中更适合,截断了位),单引号和双引号被shell去掉,这样}。这些是您需要通过
cleartool
只得到*.elf
和{shell=False
传递的字节序列。(保留shell=False
可能是最好的;如果将其设置为True
,则必须将命令粘贴到单个字符串中并引用shell元字符。)正如我在“^{} ”先决条件中提到的,必须从ClearCase视图(快照或动态视图)中执行
find
您需要确保Python子进程:
torek提到了in the comments这个问题的一个更简单的原因:
见his answer。在
如果路径(在shell上)是/vobs:。请参见“Python and ClearCase setview”了解更多信息。
它也不允许像'
clt
'这样的别名工作('cleartool
'可能有用,'clt
'不:请看“Clearcase running commands from a script (error: Bad phone number)”作为示例)使用所述动态视图的完整路径在动态视图中尝试:
一个好的测试方法是首先测试Python脚本:
cwd
(当前工作目录)的打印cleartool lsvob
(查看,如果您在动态视图中,如果those vobs are still mounted在python子进程中)。在我想我已经解决了这个问题。在
在解决方案之前,这里是我的lb和cmd的外观
“标签是问题的罪魁祸首 经过以下修改(lb和*.elf),它可以正常工作
^{pr2}$有人能解释一下子进程如何在命令中处理引号吗。 以下是我尝试过的不同组合和错误
案例1-lb和elf的双引号
案例2-elf的双引号
案例3-没有双引号给出正确答案
为什么clearcase在案例2中抱怨lbtype而不是在案例1中。在
相关问题 更多 >
编程相关推荐