php shell_exec 获取时间,Python脚本在通过PHP shell_exec()调用时挂起

我有一个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。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值