提问人:Tarique 提问时间:10/19/2023 更新时间:10/23/2023 访问量:141
Databricks 子进程与 os.system
Databricks subprocess vs os.system
问:
我有以下 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)
为什么会这样?
答:
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())
当我尝试您的命令时,我收到了以下错误。
因此,请通过 终止命令。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())
输出:
评论
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)
评论