Databricks 子进程与 os.system

Databricks subprocess vs os.system

提问人:Tarique 提问时间:10/19/2023 更新时间:10/23/2023 访问量:141

问:

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

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 azure-databricks tar

评论


答:

1赞 JayashankarGS 10/23/2023 #1

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

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

您可以通过作为单个字符串传递并将参数作为 .cmdshellTrue

法典:

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

评论

0赞 tripleee 10/23/2023
如果可以的话,你真的想避免运行东西。此外,对于许多非平凡的脚本来说,盲目地将事物与它们之间的空格连接起来是错误的。另请参阅 stackoverflow.com/questions/3172470/...shell=True
0赞 JayashankarGS 10/23/2023
@tripleee我已经在第一种方法中给出了解决方案,我给出了第二种方法,因为如果用户想要使用单个字符串命令运行。\\;
2赞 tripleee 10/23/2023 #2

当您使用列表运行时,您需要剥离任何引号或转义符,当您在您和命令行之间使用 shell 运行命令时,这些引号或转义符是必要的。subprocess

具体来说,当您有 shell 时,需要 前面的反斜杠,因为分号字符本身就是 shell 中的语句终止符。但现在你没有外壳;所以,把它拿出来。;

cmd = [
    'find', '/dbfs/mnt/data/', '-name', 'somename.tar.tar',
    '-exec', 'tar', '-xvzf', '{}', '-C', '/dbfs/mnt/raw/data', ';']

可能还会添加到您的命令中;check=True

s = subprocess.run(cmd, check=True)