你的列表中理解正在返回空列表時,根不包含.java
文件。當腳本將一個空列表傳遞給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它不是兩個for循環,它是一個列表理解作爲一個函數的參數,和一個for循環?沒有錯,我一直這樣做。 – agf
@agf,是的,從命令行運行時我沒有輸出,它似乎永遠運行。 – helpermethod