概述
我有一个Python脚本,它是用shell_exec从PHP调用的,一切正常,在Python脚本完成后,脚本返回到PHP函数,一切正常。在
现在,我更改了Python脚本,使其包含一个类,该类创建一个web驱动程序,并将驱动程序返回给通过对象调用它的脚本,然后另一个函数关闭作为参数传入的驱动程序。在
由于设置了这个新类并添加了一个对象来创建/关闭一个使用chrome的webdriver驱动程序,Python脚本在完成后会挂起,并且永远不会将控制权交还给PHP脚本来完成处理。在
我需要PHP脚本运行,然后传递给Python脚本,等待Python脚本完成并返回PHP脚本完成处理。在
所有这一过程从Run.php开始:$reponse = shell_exec('python36 "script1.py" "https://www.example.com/" "23"');
目录结构
^{pr2}$
全局.pyimport re
from selenium import webdriver
class Global:
def getDriver(self):
try:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('headless')
chrome_options.add_argument('no-sandbox')
# Windows - Dev Environment
driver = webdriver.Chrome(executable_path='C:chromedriver.exe', chrome_options=chrome_options)
# Linux - Prod Environment
#driver = webdriver.Chrome(chrome_options=chrome_options)
return driver
except Exception as e:
print('Error: ' + str(e.args[0]))
def closeDriver(self, driver):
try:
driver.close()
return None
except Exception as e:
print('Error: ' + str(e.args[0]))
scripts_dir中的所有脚本都有不同的代码,这取决于它们所执行的任务,但是新的Global对象的内容对于所有脚本都是一样的,新的全局对象是对所有脚本所做的唯一更改,因为到目前为止,Python脚本挂起的地方,它们都可以正常工作。在
Script1.pyimport os, sys
ROOT_DIR = os.path.normpath(os.path.join(os.path.abspath(__file__), '../..'))
sys.path.insert(0, ROOT_DIR)
from Global import Global
globalObj = Global()
try:
# Load all items on page
driver = globalObj.getDriver()
driver.get(PARAMS[1])
#... code to create a JSON file and populate it.
# Close webdriver
globalObj.closeDriver(driver)
print('Completed Ref: ' + str(PARAMS[2]))
except Exception as e:
print('Error: ' + str(e.args[0]))
在Python、PHP或任何其他日志中没有错误或警告,Python脚本运行并创建它们应该使用的JSON文件,并且看起来都正常工作,当Python脚本挂起时,print('Completed Ref: ' + str(PARAMS[2]))行似乎没有打印出来。在
在命令行上运行Script1.py大约需要35秒才能成功完成。在
更新-2018年2月27日
如果删除对Global类对getDriver和closeDriver的调用,则脚本将运行并完成,并返回给PHP继续处理。在
Script1.py-更新import os, sys
from selenium import webdriver
try:
# Load all items on page
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('headless')
chrome_options.add_argument('no-sandbox')
driver = webdriver.Chrome(executable_path='C:chromedriver.exe', chrome_options=chrome_options)
driver.get(PARAMS[1])
#... code to create a JSON file and populate it.
# Close webdriver
driver.close()
print('Completed Ref: ' + str(PARAMS[2]))
except Exception as e:
print('Error: ' + str(e.args[0]))
该脚本在命令行中运行良好,并且在使用上面的示例使用shell_exec通过PHP执行时运行良好,因此在创建一个对象并调用getDriver或{}类时,我一定遗漏了一些东西。在
更新2-2018年2月27日
在进一步的测试之后,我可以确认这个问题是由script1.py脚本调用类Global来创建和关闭webdriver引起的,一旦我在script1.py中删除了这些调用,脚本就可以正常运行了。在
我尝试过在globalObj.closeDriver()之后加入sys.exit(),我也尝试过在脚本的结尾添加{},但没有成功。在
更新3-2018年2月27日
我把webdriver从Chrome改成了Firefox和PhantomJS,其他的驱动程序在Global类中工作得很好,看起来这一阶段可能与Chrome驱动程序有关。在
我用的是Chrome64.0.3282.186 (Official Build) (64-bit)和Chromedriver2.35。在
最后
以上就是积极雨为你收集整理的php shell_exec 获取时间,Python脚本在通过PHP shell_exec()调用时挂起的全部内容,希望文章能够帮你解决php shell_exec 获取时间,Python脚本在通过PHP shell_exec()调用时挂起所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复