Python程序写入另一个python程序?

时间:2014-12-03 18:00:20

标签: python python-3.x keyboard-events

编程新手并开始了一个爱好项目。在Python 3.4中,我将一个程序组合在一起,将数字键入另一个充当组合锁的Python程序。组合锁读取3位数组合000-999,如果用户或第二个Python程序键入正确的3位数组合,则解锁。我使用from win32api import keybd_event完成了typer程序并具有支持它的功能。

typer程序的Snippit:

def main():
    os.startfile('lockprogram.py')
    for num in range(0,1000):
      Write(str(num).zfill(3),speed = 1000)
      Press('ENTER')
main()

这是锁定程序:

def main():
    start = 'locked'
    while start =='locked':
        password = str(input('Enter the numbered three digit password: '))

        if password == str(671).zfill(3):
            start = 'open'
            input('You unlocked the program. Enter to continue. ')
        else:
            print('Incorrect.')
    #End program response.
    x = True
    while x == True:
        response = str(input('To end press q: '))
        if response == 'q':
            x = False
        else:
            print()                           
main()

我希望typer程序专门写入lockprogram.py,而不仅仅是键盘按下打开时打字。反正有没有完成这个?像py_file.write()?

1 个答案:

答案 0 :(得分:1)

我在下面写的答案与写入文件略有不同。我使用multiprocessing.Queue(内部使用Pipe,它使用文件来传达流程),但从编程的角度来看,它看起来并没有。 t(我不知道这是不是你想要的)。如果您想使用此解决方案,则应查看multiprocessing模块的文档。

如果你愿意,你当然可以实现自己的进程间通信系统,但是一旦你开始做多线程的东西,事情会变得很难看。如果它经过多次处理,那么事情就会变得......很多,更加丑陋,所以我会选择那里存在的东西,经过充分测试...... yadda yadda yadda

我将此作为typer.py

def main(q):
    while True:
        print "Yellou. User typed %s" % q.get()

这是我的lock.py

from multiprocessing import Process, Queue
import typer

def main():
    start = 'locked'
    while start == 'locked':
        password = str(
            input('Enter the numbered three digit password: ')
        ).zfill(3)
        print "You entered %s" % password

        if password == '671':
            start = 'open'
            input('You unlocked the program. Enter to continue. ')
        else:
            print('Incorrect.')

    # End program response.
    # Launch typer.py
    q = Queue()
    p = Process(target=typer.main, args=(q,))
    p.start()

    x = True
    while x is True:
        response = input('To end press q: ')
        if response == 'q':
            x = False
            p.terminate()
        else:
            q.put(response)

if __name__ == "__main__":
    main()

为了能够import typer lock.py这两个脚本必须存在于包含第三个名为__init__.py的python文件的目录中。这个文件可以完全为空,但我告诉python它当前在一个包中(见thisthis)。

您的目录结构应如下所示:

my_programs/
    |>  typer.py
    |>  lock.py
    |> __init__.py

如果你运行lock.py,就会发生这种情况:

Enter the numbered three digit password: 671
You entered 671
You unlocked the program. Enter to continue.
Here
To end press q: helou
To end press q: Yellou. User typed helou
howdy?
To end press q: Yellou. User typed howdy?
q

正如我所提到的,我不确定这是否是您正在寻找的内容。

编辑(我认为OP试图使用typer.py找到解锁的数字"程序")

如果您想要的是模拟用户与lock.py的互动,建议您查看pexpect。据我所知,是多平台:

这将是您的typer.py

import pexpect


def main():
    child = pexpect.spawnu('python /path/to/lock.py')
    child.expect(u"Enter the numbered three digit password:.*", timeout=1)
    pwd = None
    for num in range(1000):
        if pwd is None:
            print "Trying %s" % (num)
            child.sendline(unicode(num))
            i = child.expect([
                u'You entered.*\r\nIncorrect.*',
                u'You entered.*\r\nYou unlocked the program.*',
                pexpect.EOF])
            if i == 0:
                print "%s didn't work" % num
            elif i == 1:
                print "Cracked. Num is %s" % num
                pwd = num
                child.terminate(force=True)
            else:
                print "woot?"
    return pwd
print "Got %s" % main()

那应该找到你的号码:

Trying 669
669 didn't work
Trying 670
670 didn't work
Trying 671
Cracked. Num is 671
Got 671