Hi,
We hit a very nasty problem when trying to load projects with wms layer defined
from python: loading capabilities fail with timeout error, thus preventing
creating any project or layer from python.
The problem has been verified in Debian, Ubuntu and fresh OSX build from master
branch.
We have somehow been able to reduce the problem to the loading of the
wmsprovider. The following python code provide a minimal example for
reproducing the problem:
===================8<==============================
import os
import logging
from qgis.core import QgsApplication, QgsMessageLog
from qgis.core import QgsProject, QgsProviderRegistry
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# No Display
os.environ['QT_QPA_PLATFORM'] = 'offscreen'
qgis_application = QgsApplication([], False )
qgis_application.setPrefixPath('/usr/local', True)
qgis_application.initQgis()
# Log any messages
def writelogmessage(message, tag, level):
arg = '{}: {}'.format( tag, message )
if level == QgsMessageLog.WARNING:
logger.warning(arg)
elif level == QgsMessageLog.CRITICAL:
logger.error(arg)
else:
logger.info(arg)
messageLog = QgsApplication.messageLog()
messageLog.messageReceived.connect( writelogmessage )
wmsuri =
("contextualWMSLegend=0&crs=EPSG:4326&dpiMode=7&featureCount=10&format=image/jpeg"
"&layers=s2cloudless&styles&tileMatrixSet=s2cloudless-wmsc-14"
"&url=http://tiles.maps.eox.at/wms?" )
# Request Timeout
provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri )
qgis_application.exitQgis()
del qgis_application
====================8<=============================
This fail with the following qgis errors
WMS: Download of capabilities failed: Operation canceled
Network: Network request
https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=GetCapabilities
<https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=GetCapabilities> timed out
Note that the following piece of code work perfectly and proceed the request
without problems:
==============================================================
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtNetwork import QNetworkRequest
url = QUrl("https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=GetCapabilities")
request = QNetworkRequest()
request.setUrl(url)
manager = QgsNetworkAccessManager.instance()
replyObject = manager.get(request)
loop = QEventLoop()
def onfinish( ):
print("Qt Return
Code:",replyObject.attribute(QNetworkRequest.HttpStatusCodeAttribute))
answer = replyObject.readAll();
print(answer[:200],"\n")
loop.quit()
replyObject.finished.connect( onfinish )
loop.exec()
==============================================================
So this is not fundamentally a problem with the network manager.
At this point we are stuck because the provider do not do something
fundamentally different from the last piece of code,
In qgis code the request execution stall at:
https://github.com/qgis/QGIS/blob/master/src/providers/wms/qgswmscapabilities.cpp#L1964
The problem does not occur if we run the project from the Desktop application:
we think that there is a problem with the QEventLoop execution but we have no
clue atm to check this assumption.
So if anybody have any idea on the subject…...
Regards
David
_______________________________________________
QGIS-Developer mailing list
[email protected]
List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer