如何从Jupyter Notebook中的Python字符串执行bash脚本?

时间:2017-02-01 21:27:15

标签: python bash jupyter-notebook

我正在使用Jupyter Notebook并希望从python字符串执行bash脚本。我有一个python单元格创建bash脚本,然后我需要打印,复制到另一个单元格,然后运行它。可以使用像exec('print('hello world!')')这样的东西吗?

以下是我的bash脚本示例:

%%bash -s "$folder_dir" "$name_0" "$name_1" "$name_2" "$name_3" "$name_4" "$name_5" "$name_6" "$name_7" "$name_8" "$name_9" "$name_10" "$name_11"

cd $1

ds9 ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} ${10} ${11} ${12} ${13}

如果不可能,那么我该怎么去另一个目录,然后运行

ds9 dir1 dir2 dir3 ...

在我的Jupyter笔记本中,因为我只能使用python初始化dir。请注意,每次运行代码时,目录的数量都不固定。 ds9只是同时打开多个天文图像的命令。

我知道我可以将我的bash脚本保存到.sh文件并执行它,但我正在寻找一个更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

subprocess module是从Python调用外部软件(在shell或其他方面)的正确方法。

import subprocess

folder_dir="/" # your directory
names=["name_one", "name_two"]   # this is your list of names you want to open

subprocess.check_call(
    ['cd "$1" || exit; shift; exec ds9 "$@"', "_", folder_dir] + names,
    shell=True)

工作原理(Python)

使用shell=True传递Python列表时,该列表中的第一项是要运行的脚本;第二个是该脚本运行时$0的值,后续项目是$1及以后的值。

请注意,这会使用您的命令运行sh -c '...'sh不是bash,而是(在现代系统中)POSIX sh解释器。因此,在此上下文中不使用仅使用bash的语法非常重要。

工作原理(Shell)

让我们逐行了解一下:

cd "$1" || exit # try to cd to the directory passed as $1; abort if that fails
shift           # remove $1 from our argument list; the old $2 is now $1, &c.
exec ds9 "$@"   # replace the shell in memory with the "ds9" program (as an efficiency
                # ...measure), with our argument list appended to it.

请注意引用"$1""$@"。任何不带引号的扩展都将进行字符串拆分和全局扩展;没有这个改变,你就无法打开名字中带有空格的文件。