使用 subprocess.run 导致脚本挂起

问题描述 投票:0回答:1

第一次在这里提问。

因此,我的任务是创建一个脚本来检查设备是否可以通过 ping 访问。只是想指出,我能够在我的笔记本电脑上创建一个工作脚本,并且能够获得我们想要的输出。我的笔记本电脑运行 Python 3.11.4。

现在,我们需要在脚本服务器中运行所有脚本(根据公司政策要求)。我们有一个专用的脚本服务器。我们主要在 Linux 脚本服务器中运行网络自动化。它使用python 3.7.5。

问题是,当我在 Linux 脚本服务器中运行相同的脚本时,它会挂起。没有回声或任何东西。需要按“CTRL+C”来停止它。当我这样做时,它将返回以下信息:

**^CTraceback (most recent call last):
  File "ping_nodes.py", line 28, in <module>
    shell=False)
  File "/usr/lib/python3.7/subprocess.py", line 490, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/usr/lib/python3.7/subprocess.py", line 951, in communicate
    stdout = self.stdout.read()**

逐行隔离后,实际挂起的部分是 subprocess.run 部分,如下所示,其中 IP 是包含我们的 IP 地址的变量。我尝试只使用一个 IP 地址,但行为仍然相同。

pingcheck = subprocess.run(["ping", "-n", "5", ip], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)

当我添加“Shell=True”时,它实际上并没有挂起,但结果与我们想要看到的不同。

这与不同的 python 版本有关吗?如果我们这里有人有想法,我愿意接受任何事情。

谢谢! -新手程序员

尝试添加 timeout=50 参数,但仅显示错误“Command '['ping', '-n', '5', '8.8.4.4']' 50 秒后超时”。但是当我在笔记本电脑上运行它时,无论有没有超时参数,它都运行得非常完美。

隔离脚本中挂起的部分位于 subprocess.run 部分。没有回声,需要键盘中断来停止。

尝试添加 Shell=True,she 脚本没有挂起。诡异的... 但如果 Shell 设置为 true,我们解析的结果会有所不同。我们更喜欢它而不是 False。

python subprocess network-programming python-3.7 python-3.11
1个回答
0
投票

据我了解您的问题,您想要实现的只是确定是否可以 ping 通给定的主机。如果是这样的话:

from subprocess import run, DEVNULL, CalledProcessError

def can_ping(host):
    args = [
        "ping",
        "-c",
        "1",
        host
    ]
    try:
        run(args, stdout=DEVNULL, stderr=DEVNULL, check=True)
    except CalledProcessError:
        return False
    return True


print(can_ping("www.nonsense.corp"))
print(can_ping("www.google.com"))

输出:

False
True

注:

您可能想添加超时

© www.soinside.com 2019 - 2024. All rights reserved.