2013-01-02 60 views
2

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

而这里的庆典之一:

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

顺便说一句,那三个变量都是你需要传递给你的实际脚本的吗?如果是这样,我建议将它们作为命令行参数传递,而不是使用临时文件。像Python中使用'subprocess.call([“/ home/lukasz/bashdate.sh”,year,month,month_name])'',然后'year = $ 1;月= $ 2; month_name = $ 3'在Bash中。要检查传递给Bash脚本的参数个数,可以使用'if [$#-lt 3];然后回声“请更多论据。”;出口1; fi '(或者如果您只需要三个参数,请将'-lt'更改为'-eq')。 – Blair

+0

为什么你需要一个bash脚本来将CSV压缩成一个文件并将其移动到另一个位置?你不知道标准库中的'shutil'和/或'zipfile'和'os'吗? – abarnert

+0

@abarnert直接来自python.org上的shutil页面:警告即使更高级别的文件复制函数(shutil.copy(),shutil.copy2())也无法复制所有文件元数据。除此之外(这是一个问题),另一个问题是CSV位于/ tmp中(这是mysqld由于权限而可以轻松写入文件的唯一位置)。最后,只需调用一个bash脚本的解决方案就简单多了,而且它可以工作。考虑到这是每个月手动进行一次(它需要一些其他用户输入的文档),它足够满足我的需求。 – Lukasz

回答

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中。

+0

如果你真的想要的话,你甚至可以重新使用bopt脚本来使用'getopt'。这不会太多工作。 – mgilson

+0

哦,我不知道可以做到。大概应该看看subprocess.call更多。谢谢! – Lukasz

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) 
+0

+1 - 殴打。在我的系统上进行测试,这使它工作。 – Blair

+0

这工作 - 我会标记为一旦StackOverflow会让我回答。 – Lukasz

-1

也许尝试加入shell=True的号召:

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

我真的不认为这会在这种情况下产生任何影响(除了不必要地产生shell) – mgilson