2

我有两个简单的脚本 - 我试图将一些信息(日期作为 python 脚本的输入)传递给 bash 脚本。这是python之一:

#!/usr/local/bin/python

import os
import sys
import subprocess

year = "2012"
month = "5"
month_name = "may"

file = open('date.tmp','w')
file.write(year + "\n")
file.write(month + "\n")
file.write(month_name + "\n")
file.close

subprocess.call("/home/lukasz/bashdate.sh")

这是 bash 之一:

#!/bin/bash

cat /home/lukasz/date.tmp | \
while read CMD; do
    echo -e $CMD
done
rm /home/lukasz/date.tmp

Python 脚本工作正常,没有问题。它调用了 bash 脚本,但看起来 while 循环没有运行。我知道 bash 脚本确实整体运行,因为 rm 命令被执行并且 date.tmp 文件被删除。但是,如果我在 python 中注释掉子进程调用,然后手动运行 bash 脚本,它可以很好地显示每一行。

简要说明我要完成的工作。我有一个 python 脚本,它将一个非常大的数据库导出到 CSV(几乎 300 个表和一些数据),然后调用 bash 脚本将 CSV 压缩到一个文件中并将其移动到另一个位置。我需要将提供给 python 脚本的月份和年份传递给 bash 脚本。

4

3 回答 3

5

我相信你需要file.close()代替file.close. 对于后者,您实际上并没有关闭文件,因为您没有调用该方法。由于您还没有真正关闭文件,它可能不会被刷新,因此文件的全部内容可能会被缓冲而不是写入磁盘。

作为旁注,如果您使用上下文管理器,这些事情会自动处理:

with open('foofile','w') as fout:
    fout.write("this data")
    fout.write("that data")

#Sleep well tonight knowing that python guarantees your file is closed properly
do_more_stuff(blah,foo,bar,baz,qux)
于 2013-01-02T21:34:14.573 回答
2

无需编写临时文件,而是将年、月和月名的值作为参数发送到 bash 脚本。即,在 Python 代码中删除其中的所有行file,并替换
subprocess.call("/home/lukasz/bashdate.sh")

subprocess.call(['/home/lukasz/bashdate.sh', year, month, month_name])

并且在 bash 脚本中,将这些cat ... rm行替换为 (eg)
y=$1; m=$2; mn=$3
,它将年、月和月份名称放入 shell 变量 y、m 和 mn。

于 2013-01-02T21:58:05.073 回答
-1

也许尝试添加shell=True到通话中:

subprocess.call("/home/lukasz/bashdate.sh", shell=True)
于 2013-01-02T21:38:17.403 回答