调用表单python脚本时,bash脚本不会读取行

时间:2013-01-02 21:28:53

标签: python bash

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

#!/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 one:

#!/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脚本。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:-1)

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

subprocess.call("/home/lukasz/bashdate.sh", shell=True)