4

我想知道是否可以从 python 文件中执行 bash 代码。我并不是说运行一个完全不同的 bash 文件。我正在寻找一种方法来轻松执行一行或更长的 bash 代码。具体来说,我想执行我从今天早些时候提出的问题中得到帮助的这段代码。

shopt -s nullglob
dirs=(*/)
cd -- "${dirs[RANDOM%${#dirs[@]}]}"
4

5 回答 5

4

将字符串作为sh脚本运行(假设为 POSIX):

#!/usr/bin/env python
from subprocess import check_call as x

x("""pwd
cd /
pwd""", shell=True)

您可以明确指定命令:

x(["bash", "-c", '''shopt -s nullglob
dirs=(*/)
pwd
cd -- "${dirs[RANDOM%${#dirs[@]}]}"
pwd'''])

注意:它只检查您是否可以cd进入随机子目录。更改在 bash 脚本之外不可见。

你可以在没有 bash 的情况下做到这一点:

#!/usr/bin/env python
import os
import random

print(os.getcwd())
os.chdir(random.choice([d for d in os.listdir(os.curdir) if os.path.isdir(d)]))
print(os.getcwd())

你也可以使用glob

from glob import glob

randomdir = random.choice(glob("*/"))

与之相比的不同之os.listdir()处在于glob()过滤以点开头的目录.。您可以手动过滤它:

randomdir = random.choice([d for d in os.listdir(os.curdir)
                           if (not d.startswith(".")) and os.path.isdir(d)])
于 2013-01-05T18:04:43.107 回答
1

您可以执行 bash 代码,但它的任何影响(特别是cd)只会影响它运行的子进程,因此没有意义。相反,所有这些都可以通过 Python 命令完全实现(查看glob)。

于 2013-01-05T17:48:14.907 回答
1

您可以使用参数设置为 true的子流程模块中的os.system或函数。shell

请注意,您在 bash 中所做的许多事情都可以在 Python 中轻松完成,同时保持平台独立性。例如,我最近尝试在 Windows 上运行一个 Python 脚本,该脚本使用许多 unix 命令来执行简单的操作,例如 grepping 一些文本,因此失败了。

于 2013-01-05T17:48:50.270 回答
0

最好的方法是使用命令模块

例如:

>>> import commands
>>> (status,output)=commands.getstatusoutput("ls")
>>> print(output)#print the output
>>> print(status)#print the status of executed command
于 2013-01-05T17:52:23.303 回答
0

你也可以这样做。

import os
os.system("system call 1")
os.system("system call 2")

(etc)

您可以通过这种方式编写 shell 脚本并使用 Python(更好的)循环和条件执行工具。

于 2013-01-05T19:07:52.850 回答