【问题标题】:Check if a socket is busy or not检查套接字是否忙
【发布时间】:2019-09-01 06:55:15
【问题描述】:

我是 Python 套接字编程的新手。我在 Python 3.7 中编写了以下代码:

trialSocketList.py

import subprocess
import sys

HOST = sys.argv[1]
PORT = sys.argv[2]

command = "tnc " + HOST + " -PORT "
print(command)
subprocess.call(command + PORT)

我在 Windows CMD 中传递以下内容:

python trialSocketList.py "127.0.0.1" 445

但我在执行上述代码时遇到以下错误:

tnc 127.0.0.1 -PORT
Traceback (most recent call last):
  File "trialSocketList.py", line 14, in <module>
    subprocess.call(command + PORT)
  File "C:\Python37\lib\subprocess.py", line 323, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Python37\lib\subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "C:\Python37\lib\subprocess.py", line 1178, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified

当我在同一代码中尝试 netstat -an 而不是命令 tnc 127.0.0.1 -PORT 时,代码运行良好。看了this API,我写了上面几行代码。

*如果我直接在 Windows cmd 中点击tnc 命令,我可以运行它。

我在这里遗漏了什么吗?或者还有其他更好的方法吗?如果是这样,请帮助我理解这里的问题。

提前致谢。

【问题讨论】:

    标签: python subprocess python-sockets


    【解决方案1】:

    tnc 是 PowerShell command。您需要像这样使用 PowerShell 显式运行它:

    import subprocess
    import sys
    
    HOST = "127.0.0.1"
    PORT = 445
    command = "tnc " + HOST + " -PORT " + str(PORT)
    print(command)
    subprocess.call(["powershell.exe",command],stdout=sys.stdout)
    

    输出:

    tnc 127.0.0.1 -PORT 445
    
    ComputerName     : 127.0.0.1
    RemoteAddress    : 127.0.0.1
    RemotePort       : 445
    InterfaceAlias   : Loopback Pseudo-Interface 1
    SourceAddress    : 127.0.0.1
    TcpTestSucceeded : True
    

    【讨论】:

      【解决方案2】:

      尝试用shell=True 调用Popen。以下是您的代码的外观:

      import subprocess
      import sys
      
      HOST = sys.argv[1]
      PORT = sys.argv[2]
      
      command = "tnc " + HOST + " -PORT "
      print(command)
      process = subprocess.Popen(command, stdout=tempFile, shell=True)
      

      Here 是列出的问题。

      【讨论】:

      • 这里的 tempFile 是什么?我是 Python 新手,所以很难理解那个链接。
      • 虽然我尝试将tempFile 定义为具有w+ 模式的文件。但这使文件为空,并且 cmd 中的错误保持不变。创建的文件也是空的
      • @Code_Ninja -- 临时文件所做的只是将命令的输出放入其中。
      • 好的,我尝试用tempFile = open("tempFile.txt", "w+")打开文件,这样创建文件很好,但是运行命令的情况还是一样。
      【解决方案3】:

      这里的问题是python脚本找不到tnc程序。要么根本没有安装程序,要么——如果已安装——它不在 PATH 变量中。

      【讨论】:

      • 但是,我可以从 cmd 窗口或 powershell 运行相同的操作。
      • 你从来没有说过你可以运行它。至少这意味着安装了tnc。您可以从命令行运行它的事实表明,当它试图在您的路径变量中找到程序时,发生了一些事情。您可以尝试将完整路径指定为子进程调用的一部分,也可以尝试设置shell=True。另外,它在你的道路上怎么样?还有这个:bugs.python.org/issue17023
      • 路径不在引号内,我试试shell=True。
      • 但是我用的是windows,shell=True能用吗?我以为它只适用于 Unix/Linux 系统。
      • 它仍然适用。它将使用cmd 之类的东西来执行,而不是仅仅创建一个新进程,例如subprocess.call() w/o shell=True。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多