我有两个简单的脚本 - 我试图将一些信息(日期作为输入到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脚本。
答案 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)