编程新手并开始了一个爱好项目。在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()?
答案 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它当前在一个包中(见this和this)。
您的目录结构应如下所示:
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
正如我所提到的,我不确定这是否是您正在寻找的内容。
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