2

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の1つです。

#!/bin/bash

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

Pythonスクリプトは問題なく正常に動作します。bashスクリプトを呼び出しますが、whileループが実行されていないように見えます。rmコマンドが実行され、date.tmpファイルが削除されるため、bashスクリプトが全体的に実行されることはわかっています。ただし、Pythonでサブプロセス呼び出しをコメントアウトしてから、bashスクリプトを手動で実行すると、各行が正常に表示されます。

私が達成しようとしていることの簡単な説明。非常に大きなDBをCSV(約300テーブルと数ギガのデータ)にエクスポートするPythonスクリプトがあり、bashスクリプトを呼び出してCSVを1つのファイルに圧縮し、別の場所に移動します。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
これにより、年、月、および月名がシェル変数 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 に答える