【发布时间】:2016-05-21 13:43:02
【问题描述】:
当我远程运行 Python 程序并尝试使用 PhantomJS 网络驱动程序时,大多数时候用户对我的 Python 程序的输入没有响应。一切都执行得很好,就像我在本地运行它时一样,除了大多数按键没有在 raw_input() 的提示下注册。我必须(平均)按 3 次键才能真正显示在控制台中。
这是 only 在我的程序中创建 PhantomJS 实例后的 raw_input 上的。我通过设置w = None 挑出了这个问题,其中w 是webdriver。完成此操作后,用户输入在整个程序中继续正常工作。
我可以启动另一个 ssh 会话并且标准输入工作正常。我还可以启动我的程序的另一个实例 (python run.py),在该实例创建 webdriver 之前,raw_input 在其中也可以正常工作。我尝试在另一个 ssh 会话中运行 top,但我的服务器上根本没有负载。所以只有对父 python 进程的输入受到影响。
我认为最好的情况是,有人可以帮助我找到问题的根源。我没有工具来缩小造成这种情况的范围。谢谢!
可能相关的其他信息
ps -aux 在 ssh 会话中为我提供了这些相关过程:
[TTY: pts/1, STAT: S+] python run.py
[TTY: pts/1, STAT: S1+] node /usr/local/bin/phantomjs --webdriver=52129
[TTY: pts/1, STAT: S1+] /usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs --webdriver=52129
所有这些都使用可忽略不计的内存和 CPU
Selenium webdriver 创建是自定义的-(总结)customdriver.py:
def mkDriver(params):
# params aren't relevant because this is the setup I always use on the server
w = webdriver.PhantomJS({'phantomjs.page.settings.loadImages': 'false'})
loginToFacebook(w)
loginToTwitter(w)
# for later- w.quit() leaves phantom process running
w.phantomjsPID = collectPhantomjsPID()
...虽然我不认为问题与那里的任何其他语句有关,但此函数完成执行并且我的程序继续。
一些注意事项:
笔记本电脑:OS X El Capitan,2.4GHz 英特尔酷睿 i5,8GB 内存
服务器:Ubuntu Server 14.04,2.0GHz intel xeon e5,8GB 内存 - 我使用的是我自己设置的 micro .ec2,但有人为我设置了这个,让我可以使用更强大的东西。它在 IBM Softlayer 上运行。
1234563 -tty 在 ssh 上打开和关闭(不要认为这适用于我运行程序的方式),并尝试在 python 中使用 -u 标志。
当我在服务器上运行我的程序时,最初所有 raw_input() 语句都给出了 EOFError。我使用我发现的this solution“修复”了这个问题,即使用 raw_input 在所有模块中导入 readline。不知道它为什么起作用。我知道 raw_input() 来自 sys.stdin.readline...
如果您正在查看下面的伪代码,其目的是更改 ui 及其调用的函数,然后继续测试,而无需在
resources中重新生成任何内容(大多数重要的是 webdriver,它需要很长时间才能加载)。该结构还可以轻松进行一些预先编写的测试。
模块概述...
运行.py:
params = raw_input('enter parameters')
w = customdriver.mkDriver(params)
t = tweepy_connection()
f = facebook_Graph_API_conection()
s = sqlAlchemy_engine()
resources = [w, t, f, s]
while True:
choice = raw_input('1: break, 2: restart ui')
if choice == '1':
break
elif choice == '2':
reload(ui.py)
ui.ui_function(resources)
else:
continue
ui.py:
def ui_function(resources):
while True:
choice = raw_input('1: break, 2: functionA, 3: functionB')
if choice == '1':
break
elif choice == '2':
reload(file1)
params = raw_input('enter parameters')
file1.functionA(resources, params)
elif choice == '3':
reload(file2)
params = raw_input('enter some other parameters')
file2.functionB(resources, params)
else:
continue
【问题讨论】:
标签: python linux selenium-webdriver ssh phantomjs