使用Python结合subprocess实现文件特定行复制及追加失败排查
我来帮你一步步排查和解决这个问题:
1. 先确保Perl脚本完全执行完再追加代码
你用的subprocess.Popen是非阻塞的——Python启动Perl进程后,不会等它跑完就继续执行后续的追加操作,这时候file2.sv可能还没生成完,甚至还没创建,自然追加就没效果。
解决起来很简单,要么给Popen加等待,要么直接用更省心的subprocess.run:
# 方法1:用run(Python3.5+支持),默认阻塞,会等脚本执行完再往下走 result = subprocess.run(["Verilog.pl", "file1.v", "file2.sv", "0", ...], check=True) # 方法2:如果坚持用Popen,一定要加wait() pipe = subprocess.Popen(["Verilog.pl", "file1.v", "file2.sv", "0", ...]) pipe.wait() # 等Perl脚本彻底执行完毕再处理后续
这里的check=True很有用,要是Perl脚本执行出错(返回非0状态码),Python会直接抛出异常,方便你快速发现脚本本身的问题。
2. 检查追加代码的逻辑是否靠谱
假设Perl脚本已经生成好file2.sv了,接下来要确认你从file1.v提取特定行的逻辑没毛病。比如是按标记字符串提取,还是按行号?
举个按标记提取的例子(比如从// START到// END之间的代码):
# 先从file1.v里捞目标代码段 target_lines = [] in_section = False with open("file1.v", "r") as f1: for line in f1: if "// START" in line: # 替换成你的起始标记 in_section = True continue # 要是不想把起始标记行也加进去就跳过 if "// END" in line: # 替换成你的结束标记 in_section = False continue if in_section: target_lines.append(line) # 再追加到file2.sv末尾 with open("file2.sv", "a") as f2: # 重点!用"a"模式才是追加,用"w"会清空重写 f2.writelines(target_lines)
要是按行号提取,注意Python的列表索引是从0开始的,比如提取第5到第10行:
with open("file1.v", "r") as f1: all_lines = f1.readlines() target_lines = all_lines[4:10] # 第5行对应索引4,切片是左闭右开,所以到10
3. 确认Perl脚本没覆盖你的追加内容
有些脚本生成文件时,会先清空目标文件再写入——不过你是先让脚本生成file2.sv再追加,所以主要确认脚本执行完后file2.sv确实存在,内容是你预期的。可以加个小检查:
import os # 等Perl脚本跑完后检查文件是否存在 if not os.path.exists("file2.sv"): raise FileNotFoundError("Perl脚本没生成file2.sv!先检查脚本参数和逻辑吧")
4. 排查Perl脚本的执行状态
有时候Perl脚本可能悄悄出错了,但Python没告诉你,导致file2.sv没生成或者不完整。可以捕获脚本的输出看看:
result = subprocess.run(["Verilog.pl", "file1.v", "file2.sv", "0", ...], capture_output=True, text=True) print("脚本返回码:", result.returncode) print("脚本输出:", result.stdout) print("脚本错误信息:", result.stderr)
返回码不是0的话,就根据stderr里的提示去排查Perl脚本的问题。
内容的提问来源于stack exchange,提问作者sanforyou
相关产品推荐
相关产品推荐

