簡體   English   中英

Python 運行進程不作為子進程

[英]Python run process not as subprocess

我有一個電報機器人,我想用它來啟動另一個電報機器人。 你不能在一個 python 腳本中運行兩個電報機器人,所以我有兩個 python 腳本:main.py 和 gs_main.py。 當我在兩個單獨的屏幕會話中同時運行它們時,一切都很好。 但是,從 main.py 啟動 gs_main.py 讓我很頭疼。 我的最后一次嘗試如下:

在 main.py 中,我有以下命令來啟動 gs_main.py:

def gostart(update: Update, context: CallbackContext) -> None:
    user = update.effective_user
    global goserver
    
    if user.id == USER_ID:
        goserver = os.system("./start_goserver.sh")

start_goserver.sh 的內容如下:

cd /home/ubuntu/gosharing
python3 gs_main.py

但是,這似乎將 gs_main.py 作為 main.py 的子進程打開,因為我收到以下錯誤:

Error while getting Updates: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
No error handlers are registered, logging exception.
Traceback (most recent call last):
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/ext/updater.py", line 646, in _network_loop_retry
    if not action_cb():
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/ext/updater.py", line 597, in polling_action_cb
    updates = self.bot.get_updates(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/ext/extbot.py", line 222, in get_updates
    updates = super().get_updates(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/bot.py", line 130, in decorator
    result = func(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/bot.py", line 2861, in get_updates
    self._post(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/bot.py", line 295, in _post
    return self.request.post(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/utils/request.py", line 361, in post
    result = self._request_wrapper(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/telegram/utils/request.py", line 283, in _request_wrapper
    raise Conflict(message)
telegram.error.Conflict: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running

我的問題是,如何運行 gs_main.py 而不是 main.py 的子進程?

如果您使用 linux,您可以嘗試將兩個進程都發送到后台。

  1. 開始你的第一個腳本
  2. 按:CTRL+Z
  3. 類型:bg
  4. 開始你的第二個腳本
  5. 按:CTRL+Z
  6. 類型:bg

如果你想用一個簡單的命令運行這兩個腳本,你可以像這樣創建第三個腳本:

import os

os.spawnl(os.P_DETACH, python, 'script_1.py')
os.spawnl(os.P_DETACH, python, 'script_2.py')

您可以在此處找到有關 spawnl function 的更多信息:

Python 3 - 產卵

我手動解耦了兩個腳本,如下所示。 在我的 main.py 中,我將命令更改為:

def gostart(update: Update, context: CallbackContext) -> None:
    user = update.effective_user
    global goserver
    
    if user.id == USER_ID:
        os.system("echo 1 > /home/ubuntu/gosharing/run")

然后,在 /home/ubuntu/gosharing 中,我使用以下代碼創建了第二個 main.py:

import os

run = 0
prev = 0

while True:
    file = open("run", "rb")
    try:
        run = int(file.readline())
    except:
        pass
    file.close()
    
    if (prev == 0) & (run == 1):
        os.system("pkill -f gs_main.py && python3 gs_main.py > log &")
        print("starting server")
    if (prev == 1) & (run == 0):
        os.system("pkill -f gs_main.py")
        print("killing server")
    
    prev = run

有用:)。 可能不是最優雅的解決方案,但它可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM