我有一个要运行的循环 A,它从目录 D 中读取数据并执行操作。 A 编辑文件并处理与另一个对象的通信,我想避免同步方面的困难。我希望能够通过脚本 B.py 调用 A,该脚本将数据加载到 D 中,并在 A 未运行时启动 A。
理想情况下,我希望能够知道 A 的启动是否失败,并将该打印到试图启动它的控制台(我不知道该怎么做),同时完成此操作是“最安全的”并且具有良好的 python 实践。我也想知道是否有办法通过套接字以某种方式收听 A。
我一直在想的实现方式如下: A.py是一个包含A的文件。A.py首先连接到一个套接字,如果它不起作用那么我们可能根据退出代码知道(?)
import time
import socket
import sys
import os
DEFAULT_PORT = 9563
try:
# Building manager lock to prevent another instance from running
lock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
lock.bind(("localhost", DEFAULT_PORT))
except OSError:
print("A is already running")
sys.exit(3)
filename = "log.txt"
dirname = "D"
for i in range(30):
with open(filename, "a", encoding="utf8") as f:
num_files = len(os.listdir(dirname))
f.write(f"idx: {i}, {time.asctime()}, {num_files} files found\n")
time.sleep(1)
然后在B中,我们可以把文件放到D目录下,用子进程Popen调用A。因为 A 检查一个默认端口,所以它只能有一个实例。
import os
import sys
import platform
import time
import subprocess
dirname = "D"
# Putting data into our directory
filename = str(time.time())
with open(os.path.join(dirname, filename), mode="w", encoding="utf8") as f:
f.write("a file")
kwargs = {}
if platform.system() == "Windows":
CREATE_NEW_PROCESS_GROUP = 0x00000200
DETATCHED_PROCESS = 0x00000008
kwargs.update(creationflags=DETATCHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
else:
kwargs.update(satart_new_session=True)
p = subprocess.Popen([sys.executable, "A.py"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, **kwargs)
assert not p.poll()
print("Goodbye")
sys.exit(0)
所以我只是想问问这是否是执行此操作的 pythonic 方法。听说开子进程是反模式,不知道有没有更好的办法
这有效并且符合我的预期。我只是想知道这是否是最好的做法。
编辑:我的情况是这样的: 我在生物实验室工作,我们有一台与计算机接口的设备。这个设备可以有覆盖旧命令的命令,我不能碰这个代码。我需要我们的实验室计算机根据它管理的每个实验的配置文件找出逻辑,并将它们打包成指令,如果没有变化则重复指令。
我们曾经有代码可以记住每个实验的旧指令,如果这些指令没有被执行(发生覆盖),就重新发送它们。我已经重写了这项工作以获得更清晰的实现,但我希望能够通过一个命令将配置文件复制到一个文件夹中供 A 浏览,但如果 A 尚未启动则也可以启动它.我也希望它是跨平台的,因为我希望它能够抵抗实验室更换管理它的计算机。
实验可以有可变的开始和结束时间,如果有一个现有的实验正在运行,指令的管理仍然必须发生。这样如果 X 昨天开始他们的实验,Y 今天开始他们的实验不应该导致竞争条件,如果 X 的实验在 Y 之前结束,Y 正在进行的实验不应该被打断。