Запись в исходный ввод другой программы Python без появления нового черного экрана - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь перебором программы на Python:
мне нужно сделать еще один файл Python, который будет запускать
первый код Python с вводом (первый код принимает ввод с помощью raw_input)

Проблема в том, что в первом коде используется pygame, поэтому, если я хочу использовать brute-force, мне нужно запустить его, попробовать число, затем открыть его снова и продолжить проверку таким образом ...
Есть идеи, как написать в процесс raw_input, как грубой силы?

Это облегченная версия того, что я пытаюсь сделать: (без пигмея)

первый код: (тот, который мне нужен для подбора)

found = []
while 1:


    a =int(raw_input("ENTER : "))
    print "THE NUM: ", a
    if a in [74,82,101,550,990]:
        print a , "  Got number right!"
        found.append(a)

    if [74,82,101,550,990] == found:
        print "WINNER!!!!!"
        break

У этого нет Pygame, но идея остается прежней ..

Я пытался использовать этот код:

import subprocess
for i in range(1000):
    process = subprocess.Popen(["grep", "PATH TO PYCODE"], 
    stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    process.stdin.write(i)
    print process.communicate()[0]
    process.stdin.close()

Но выдает эту ошибку:

WindowsError: [Error 2] The system cannot find the file specified

и путь на 100% правильный ...

Редактировать: если я пишу в cmd:

echo 5 | python PATH_TO_FILE

, появляется эта ошибка:

EOFError: EOF when reading a line

Спасибо запомогая!:)

1 Ответ

0 голосов
/ 06 декабря 2018

У вас есть несколько проблем.

Во-первых, главная программа (которую я назову check.py) не завершается в EOF, она выдает ошибку.Во-вторых, главная программа написана для интерактивной работы, но вы используете ее не интерактивно.Удаление «ВХОД:» должно быть достаточно, чтобы исправить это для ваших целей.

Попробуйте это:

import sys
found = []
for line in sys.stdin:
    line = line.strip();

    a = int(line);
    print "THE NUM: ", a
    if a in [74,82,101,550,990]:
        print a , "  Got number right!"
        found.append(a)

    if [74,82,101,550,990] == found:
        print "WINNER!!!!!"
        break

В-третьих, нижняя программа никогда не будет ПОБЕДИТЕЛЕМ, потому что она перезапускает программу длякаждая догадкаВ-четвертых, вы записываете двоичные значения в канал, но ваша программа ожидает текст.

import subprocess

process = subprocess.Popen(["python", "check.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
for i in range(1000):
    process.stdin.write("%d\n" % i)
print process.communicate()[0]
process.stdin.close()

Перед запуском этого вы, вероятно, захотите удалить распечатку "THE NUM" из check.py.

Тем не менее, в вашем первоначальном вопросе говорилось, что вам нужно перезапускать pygame каждый раз, так что в этом случае вы должны оставить цикл на i, как вы это делали изначально - это просто не то, чего ожидает ваша примерная программа.

Вот вывод с закомментированным выводом «THE NUM:»:

$ python pipe.py
74   Got number right!
82   Got number right!
101   Got number right!
550   Got number right!
990   Got number right!
WINNER!!!!!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...