Python中的UNIX命令链

时间:2017-10-27 12:54:01

标签: python unix chain

我想在Python中执行以下UNIX命令:

cd 2017-02-10; pwd; echo missing > 123.txt

日期目录DATE = 2017-02-10OUT = 123.txt已经是Python中的变量,所以我尝试了各种变体

call("cd", DATE, "; pwd; echo missing > ", OUT)

使用subprocess.call函数,但我很难同时找到多个UNIX命令的文档,这些命令通常由;分隔,或者与>

分开

在Python中单独的行上执行命令也不起作用,因为它“忘记”在前一行执行的操作并且必须重置。

3 个答案:

答案 0 :(得分:1)

您可以将shell脚本作为单个参数传递,并将字符串替换为带外参数,如下所示:

date='2017-02-10'
out='123.txt'

subprocess.call(
  ['cd "$1"; pwd; echo missing >"$2"',  # shell script to run
   '_',                                 # $0 for that script
   date,                                # $1 for that script
   out,                                 # $2 for that script
  ], shell=True)

这比将dateout值替换为由shell作为代码计算的字符串更安全,因为这些值被视为文字:A date of $(rm -rf ~)实际上不会尝试删除您的主目录。 :)

答案 1 :(得分:1)

  

在Python中单独的行上执行命令也不起作用   因为它“忘记”了前一行所执行的内容   必要性重置。

这是因为如果您对subprocess.call进行单独调用,它将在自己的shell中运行每个命令,cd调用对后来的shell没有影响。

另一种方法是在完成剩下的工作之前更改Python脚本本身的目录。这是否是一个好主意取决于脚本的其余部分。你真的需要改变目录吗?为什么不直接从Python写“遗漏”到2017-02-10/123.txt?为什么需要pwd来电?

假设您正在遍历目录列表并希望输出每个目录的完整路径并且还创建其中包含“缺失”的文件,您可以这样做:

import os

base = "/path/to/parent"
for DATE, OUT in [["2017-02-10", "123.txt"], ["2017-02-11", "456.txt"]]:
    date_dir = os.path.join(base, DATE)
    print(date_dir)
    out_path = os.path.join(date_dir, OUT)
    out = open(out_path, "w")
    out.write("missing\n")
    out.flush()
    out.close()

如果您没有写入文件的权限或者目录不存在,上面可能会使用一些错误处理,但是您的shell命令也没有任何错误处理。

答案 2 :(得分:0)

>>> date = "2017-02-10"
>>> command = "cd " + date + "; pwd; echo missing > 123.txt"
>>> import os
>>> os.system(command)