鱼C论坛

 找回密码
 立即注册
查看: 2026|回复: 3

[已解决]怎么判断 os.system调用, 已经生成文件完毕,可以进行下一步编辑了?

[复制链接]
发表于 2023-4-18 08:06:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
命令  os.system(f"""XXX """)  执行完成后会生成 1个mp3 和 字幕 srt 文件。


os.system(f"""XXX """)     #生成  1.mp3, 1.srt
sleep(120)
这里怎么判断 多久之后 1.srt 能生成完毕,把sleep语句替换掉?是不是 检测 有无存在 1.srt 文件,如果存在了,就一定生成并写入完成了吗?

(1.srt).replace('abc','')
最佳答案
2023-4-18 09:00:46
本帖最后由 isdkz 于 2023-4-18 09:02 编辑
blackantt 发表于 2023-4-18 08:43
os.system 生成 1.srt  是不是也要 分3步
1. open 1.srt
2. write buffer to 1.srt (line by line)


如果这个命令不是一个后台命令,那么 os.system 会阻塞在当前线程,也就是如果代码执行到了后面就已经说明你的命令已经执行完成了,

如果您要执行一个后台命令(例如运行一个bat文件),subprocess库通常是更好的选择。使用subprocess库,您可以在Python中更灵活地管理外部进程,包括等待进程完成、获取输出和错误信息等。

下面是一个示例,展示了如何使用subprocess.run()来执行一个bat文件,并等待其完成:
import subprocess

bat_file = "your_bat_file.bat"
result = subprocess.run(["cmd", "/c", bat_file], text=True, capture_output=True)

if result.returncode == 0:
    print("The command was executed successfully.")
    print("Output:", result.stdout)
else:
    print("An error occurred during the execution of the command.")
    print("Error:", result.stderr)

这个示例中,我们使用subprocess.run()执行一个bat文件。参数text=True表示以文本模式处理输出,capture_output=True表示捕获命令的输出和错误信息。

subprocess.run()将返回一个subprocess.CompletedProcess对象,其中包含命令的退出状态(returncode)、输出(stdout)和错误信息(stderr)。您可以根据这些信息判断命令是否执行成功以及命令的执行结果。


如果您仍然希望使用 os.system() 来执行后台命令(例如运行一个bat文件),一种可能的方法是在命令执行完成时创建一个标志文件。然后,您可以监视标志文件的存在,以确定命令何时完成。

在您的bat文件中,您可以在所有操作完成后添加一行代码来创建一个标志文件:
echo. > flag_file.txt

然后在 Python 代码中,使用 os.system() 执行 bat 文件,并检查标志文件是否存在,以确定命令何时完成:
import os
import time

os.system("your_bat_file.bat")

flag_file = "flag_file.txt"
while not os.path.exists(flag_file):
    time.sleep(1)  # 每次检查之间暂停1秒

# 这里可以执行下一步操作,例如编辑文件

# 删除标志文件
os.remove(flag_file)

这个方法的缺点是需要修改您的bat文件,而且需要额外的文件来充当标志。尽管如此,在某些情况下,这可能是使用 os.system() 的最佳解决方案。然而,使用 subprocess 通常是更好的选择,因为它提供了更多的灵活性和控制。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-18 08:31:57 | 显示全部楼层
要判断 os.system() 调用已经生成文件完毕,可以使用 Python 的 os.path.exists() 函数来检测文件是否存在。然后,通过循环和适当的延迟来持续检查文件是否存在。当文件存在时,你可以认为文件生成已经完成,并进行下一步操作。这是一个例子:
import os
import time

os.system(f"""XXX """)  # 生成 1.mp3, 1.srt

srt_filename = '1.srt'
while not os.path.exists(srt_filename):
    time.sleep(1)  # 每次检查之间暂停1秒

# 这里可以执行下一步操作,例如编辑 .srt 文件
with open(srt_filename, 'r') as file:
    content = file.read()

content = content.replace('abc', '')

with open(srt_filename, 'w') as file:
    file.write(content)

这个代码会先执行 os.system(f"""XXX """ ) 生成 1.mp3 和 1.srt 文件。接下来,使用 os.path.exists() 检查 1.srt 文件是否存在。如果不存在,代码会暂停1秒,然后继续检查。当 1.srt 文件存在时,代码会继续执行,并打开文件进行编辑。

或者说你可以通过判断 os.system 的返回值来确认命令是否执行成功。os.system() 的返回值通常表示命令执行的退出状态,退出状态为0通常表示成功执行,非0值表示出现错误。
import os

exit_code = os.system(f"""XXX """)  # 生成 1.mp3, 1.srt

if exit_code == 0:
    # 这里可以执行下一步操作,例如编辑 .srt 文件
    # 但无法保证文件已经生成完毕
    pass
else:
    print("An error occurred during the execution of the command.")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 08:43:20 | 显示全部楼层
isdkz 发表于 2023-4-18 08:31
要判断 os.system() 调用已经生成文件完毕,可以使用 Python 的 os.path.exists() 函数来检测文件是否存在 ...

os.system 生成 1.srt  是不是也要 分3步
1. open 1.srt
2. write buffer to 1.srt (line by line)
3.close 1.srt

   os.path.exists() 在第1步之后就true了吗?  马上就编辑 1.srt 的话, 是否第2,3步还未真正完成?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 09:00:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-4-18 09:02 编辑
blackantt 发表于 2023-4-18 08:43
os.system 生成 1.srt  是不是也要 分3步
1. open 1.srt
2. write buffer to 1.srt (line by line)


如果这个命令不是一个后台命令,那么 os.system 会阻塞在当前线程,也就是如果代码执行到了后面就已经说明你的命令已经执行完成了,

如果您要执行一个后台命令(例如运行一个bat文件),subprocess库通常是更好的选择。使用subprocess库,您可以在Python中更灵活地管理外部进程,包括等待进程完成、获取输出和错误信息等。

下面是一个示例,展示了如何使用subprocess.run()来执行一个bat文件,并等待其完成:
import subprocess

bat_file = "your_bat_file.bat"
result = subprocess.run(["cmd", "/c", bat_file], text=True, capture_output=True)

if result.returncode == 0:
    print("The command was executed successfully.")
    print("Output:", result.stdout)
else:
    print("An error occurred during the execution of the command.")
    print("Error:", result.stderr)

这个示例中,我们使用subprocess.run()执行一个bat文件。参数text=True表示以文本模式处理输出,capture_output=True表示捕获命令的输出和错误信息。

subprocess.run()将返回一个subprocess.CompletedProcess对象,其中包含命令的退出状态(returncode)、输出(stdout)和错误信息(stderr)。您可以根据这些信息判断命令是否执行成功以及命令的执行结果。


如果您仍然希望使用 os.system() 来执行后台命令(例如运行一个bat文件),一种可能的方法是在命令执行完成时创建一个标志文件。然后,您可以监视标志文件的存在,以确定命令何时完成。

在您的bat文件中,您可以在所有操作完成后添加一行代码来创建一个标志文件:
echo. > flag_file.txt

然后在 Python 代码中,使用 os.system() 执行 bat 文件,并检查标志文件是否存在,以确定命令何时完成:
import os
import time

os.system("your_bat_file.bat")

flag_file = "flag_file.txt"
while not os.path.exists(flag_file):
    time.sleep(1)  # 每次检查之间暂停1秒

# 这里可以执行下一步操作,例如编辑文件

# 删除标志文件
os.remove(flag_file)

这个方法的缺点是需要修改您的bat文件,而且需要额外的文件来充当标志。尽管如此,在某些情况下,这可能是使用 os.system() 的最佳解决方案。然而,使用 subprocess 通常是更好的选择,因为它提供了更多的灵活性和控制。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 17:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表