我尝试在 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)
为什么会这样?
使用以下代码检查您遇到的错误。
import subprocess
s = subprocess.run(cmd,capture_output=True)
print("Error "+s.stderr.decode())
print("Output "+s.stdout.decode())
当我尝试你的命令时,出现以下错误。
因此,通过
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())
输出:
或者
您可以通过将
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())
输出: