Databricks 子进程与 os.system

问题描述 投票:0回答:1

我尝试在 databricks 中运行以下 shell 命令:

find /dbfs/mnt/data/ -name somename.tar.tar -exec tar -xvzf {} -C /dbfs/mnt/raw/data \;

当我将其作为 shell 命令运行或使用 os.system 运行时(如下所示),它会在 databricks 笔记本中运行并提取文件。 外壳:

%sh    
find /dbfs/mnt/data/ -name somename.tar.tar -exec tar -xvzf {} -C /dbfs/mnt/raw/data \;

蟒蛇:

cmd = ['find', '/dbfs/mnt/data/', '-name', 'somename.tar.tar', '-exec', 'tar', '-xvzf', '{}', '-C', '/dbfs/mnt/raw/data', '\\;']
cmd_join = " ".join(cmd)
os.system(cmd_join)

但是即使单元成功运行,将其作为子进程运行似乎也不会执行任何操作。

subprocess.run(cmd)

为什么会这样?

subprocess sh databricks azure-databricks tar
1个回答
0
投票

使用以下代码检查您遇到的错误。

import subprocess
s = subprocess.run(cmd,capture_output=True)
print("Error "+s.stderr.decode())
print("Output "+s.stdout.decode())

当我尝试你的命令时,出现以下错误。

enter image description here

因此,通过

exec
终止
;
命令。

代码:

import subprocess

cmd = ['find', '/dbfs/FileStore/', '-name', 'sample.tar.tar', '-exec', 'tar', '-xvf', '{}', '-C', '/dbfs/mnt/raw/data', ';']
s = subprocess.run(cmd,capture_output=True)
print("Error "+s.stderr.decode())
print("Output "+s.stdout.decode())

输出:

enter image description here

或者

您可以通过将

cmd
作为单个字符串传递并将
shell
参数作为
True
来运行命令。

代码:

cmd = ['find', '/dbfs/FileStore/', '-name', 'sample.tar.tar', '-exec', 'tar', '-xvf', '{}', '-C', '/dbfs/mnt/raw/data', '\\;']
cmd_join = " ".join(cmd)
s = subprocess.run(cmd_join,shell=True,capture_output=True)
print("Error "+s.stderr.decode())
print("Output "+s.stdout.decode())

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.