MartinSahlen/cloud-functions-python

Cannot run handle_http example

manurueda opened this issue · 12 comments

Hi Martin,

First of all, congrats for the tool. It seems really promising!

I've been trying to run handle_http example, I get status: READY (everything goes fine, apparently) but get a 500 when I enter the resulting url. When I log to google cloud error reporting I got this error:

ImportError: No module named urlparse Failed to execute script function
at _import_module (site-packages/six.py:82)
at _resolve (site-packages/six.py:160)
at __get__ (site-packages/six.py:92)
at <module> (site-packages/cloudfn/http.py:5)
at load_module (/tmp/pip-build-QIE5nA/pyinstaller/PyInstaller/loader/pyimod03_importers.py:389)
at <module> (function.py:1)

My steps are:
1/ create files function.py, deploy.sh and requirements.txt
2/ create new virtualenv and install requirements
3/ launch deploy

I checked on the python console if I can import urlparse, or six.moves.urlib.parse and everything seems fine. I am running everything on python 2.7.

I am a bit lost, maybe you can help me.

function.py

from cloudfn.http import Response, handle_http_event


def handle_http(req):
    return Response(
        status_code=200,
        body={'key': 2},
        headers={'content-type': 'application/json'},
    )


handle_http_event(handle_http)

requirements.txt

pycloudfn==0.1.205


deploy.sh

py-cloud-fn handle_http http -p -f function.py --python_version 2.7 && \
cd cloudfn/target && gcloud beta functions deploy handle_http \
--trigger-http --stage-bucket <MYBUCKET> --memory 2048MB && cd ../..

Thanks, I'll have a look this weekend :D

And please bear with me, this was created over a few jetlagged days in New York, it is very much alpha 😂

Other examples work pretty well 💯

@jmderueda I can't see your full trace, but might be the same issue I am having - my trace after deployed and tested is:

File "http_test.py", line 1, in
File "/tmp/pip-build-1Vm687/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "site-packages/cloudfn/http.py", line 5, in
File "site-packages/six.py", line 92, in get
File "site-packages/six.py", line 160, in _resolve
File "site-packages/six.py", line 82, in _import_module
ImportError: No module named urlparse

I think it's an issue with using urlparse (from six) vs urlparse (built-in python). Both urlparse return the same object so I think we can use python's built-in safely.

@MartinSahlen maybe we can test this this change in http.py? Let me know if you're OK I can send another pull request for this change (I wasn't able to test because when deployed, requirements.txt
does not seem to like git+git://xxxxx@branch)
[edit] the fix will only work for python 2, with python 3 we would need a couple of more lines. If this is the issue, I will add to the fix.

Thanks

Just wondering if this (not using six) will break compatibility with python2+3?

As far as my understanding goes, six is a compatibility layer that makes sure that code works on both python 2 and 3 where stuff is deprecated or changed? I'll look some more into this.

We could do something like:

try:
from six.moves.urllib_parse import urlparse
except ImportError:
from urlparse import urlparse

@MartinSahlen @marcelopham I can confirm the change in http.py of

from six.moves.urllib_parse import urlparse
to
from urlparse import urlparse

change worked for me using python 2.7. Though because py-cloud-fn pulls its requirements from pip at build time, I had to manually edit the site-packages within the cloudfn directory and recompile the python .pyc file before deploying.

Hi,

Trying for the first time the repo and got the same error. Any progress on this topic ? I'm using Python 2.7.

What are the issues using the default urlparse lib instead of the one provided by six ?

Thanks @davidbernat, your steps description worked for me as well.

Thanks