あなたのリストの内包は、空のリストを返しています。スクリプトが空のリストをfileinput.input()
に渡すと、stdinからのデフォルトの予想入力に戻ります。 stdinから何も入力されないので、あなたのスクリプトはブロックされます。
代わりにこれを試してみてください:
def main():
for root, dirs, files in os.walk('target/generated-sources'):
java_files = [os.path.join(root, file) for file in files if file.endsWith('.java')]
if not java_files: # go to next iteration if list is empty
continue
for line in fileinput.input(java_files, inplace=True):
match = re.search(r'@Table\(name = "(.*)"\)', line)
output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line
print output,
はまた、ファイルの発見のロジックを分割。以下は、ファイルのリストを生成するジェネレータを作成し、それを
fileinput
の入力として使用することができます。
import os, fnmatch, fileinput
def find_files(directory, pattern):
"Generator that returns files within direction with name matching pattern"
for root, dirs, files in os.walk(directory):
for basename in fnmatch.filter(files, pattern):
filename = os.path.join(root, basename)
yield filename
for line in fileinput.input(find_files("target/generated-sources", "*.java")):
match = re.search(r'@Table\(name = "(.*)"\)', line)
output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line
print output,
出力もありませんか?一部のGUIインタプリタでのみブロックされるのでしょうか、コマンドラインから直接実行されるのでしょうか?単一の '.java'ファイルに対して実行するとどうなりますか?一致しているファイルのサンプルを表示して、プログラムを自分で実行してください。 – agf
@Andrewそれは2つのループではなく、関数の引数としてのリストの理解とforループです。何も間違っていない、私はいつもそれをする。 – agf
@agf、はい、コマンドラインから実行すると出力がなくなり、永遠に実行されるようです。 – helpermethod