Я новичок в программировании сокетов в Python. Я написал следующий код в Python 3.7:
пробная версияSocketList.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
в том же коде, код работает отлично. Я написал приведенные выше несколько строк кода после прочтения это API.
*Я могу запустить команду tnc
, если нажму ее прямо в Windows cmd.
Я что-то упустил здесь? Или есть другой лучший способ сделать это? Если это так, то, пожалуйста, помогите мне понять проблему здесь.
Заранее спасибо.
Проблема здесь в том, что скрипт Python не может найти программу tnc
. Либо программа вообще не установлена, либо --- если она установлена --- ее нет в переменной PATH.
Ты никогда не говорил, что можешь управлять им вообще. По крайней мере, это означает, что tnc
установлен. Тот факт, что вы можете запустить его из командной строки, говорит о том, что что-то происходит, когда он пытается найти программу в вашей переменной пути. Вы можете попробовать указать полный путь как часть вызова подпроцесса или попробовать установить shell=True
. Кроме того, как это на вашем пути? Еще есть это: bugs.python.org/issue17023
Путь не в кавычках, попробую shell=True
.
Но поскольку я использую Windows, будет ли применимо shell=True
? Я думал, что это только для систем Unix/Linux.
Он по-прежнему применим. Он будет использовать что-то вроде cmd
для выполнения вместо простого создания нового процесса, такого как subprocess.call()
без shell=True
.
shell=True
не помогло.
Попробуйте вызвать Popen
с помощью shell=True
. Вот как будет выглядеть ваш код с этим:
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)
Здесь — указанная проблема.
Что такое tempFile здесь? Я новичок в Python, поэтому трудно понять эту ссылку.
Хотя я пытался определить tempFile
как файл с режимом w+
. Но это оставило файл пустым, и ошибка в cmd осталась прежней. Созданный файл также был пуст
@Code_Ninja -- Все, что делает временный файл, это помещает в него вывод команды.
хорошо, я попробовал открыть файл как tempFile = open("tempFile.txt", "w+")
, это создало файл красиво, но ситуация с запуском команды осталась прежней.
tnc
— это Команда PowerShell. Вам нужно будет явно запустить его с помощью 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
Но я могу запустить то же самое из окна cmd или powershell.