我有两个简单的脚本 - 我试图将一些信息(日期作为输入到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脚本。
顺便说一句,那三个变量都是你需要传递给你的实际脚本的吗?如果是这样,我建议将它们作为命令行参数传递,而不是使用临时文件。像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
为什么你需要一个bash脚本来将CSV压缩成一个文件并将其移动到另一个位置?你不知道标准库中的'shutil'和/或'zipfile'和'os'吗? – abarnert
@abarnert直接来自python.org上的shutil页面:警告即使更高级别的文件复制函数(shutil.copy(),shutil.copy2())也无法复制所有文件元数据。除此之外(这是一个问题),另一个问题是CSV位于/ tmp中(这是mysqld由于权限而可以轻松写入文件的唯一位置)。最后,只需调用一个bash脚本的解决方案就简单多了,而且它可以工作。考虑到这是每个月手动进行一次(它需要一些其他用户输入的文档),它足够满足我的需求。 – Lukasz