Skip to content
This repository has been archived by the owner on Apr 9, 2024. It is now read-only.

Missing chromedriver.exe on Windows results in cryptic JSONDecodeError error #93

Closed
kannes opened this issue Feb 8, 2021 · 4 comments
Closed

Comments

@kannes
Copy link
Contributor

kannes commented Feb 8, 2021

I tried to run code I had written Linux in a Windows & Conda environment. When trying to save a chart to SVG, I got a JSONDecodeError:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-23-be5f964fdbaf> in <module>
     12 
     13     chart = make_plot(df, foo, bar)
---> 14     chart.save(filepath, format="svg")
     15     ...
     16     

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair\vegalite\v4\api.py in save(self, fp, format, override_data_transformer, scale_factor, vegalite_version, vega_version, vegaembed_version, **kwargs)
    474         if override_data_transformer:
    475             with data_transformers.disable_max_rows():
--> 476                 result = save(**kwds)
    477         else:
    478             result = save(**kwds)

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair\utils\save.py in save(chart, fp, vega_version, vegaembed_version, format, mode, vegalite_version, embed_options, json_kwds, webdriver, scale_factor, **kwargs)
    110         write_file_or_filename(fp, mimebundle["text/html"], mode="w")
    111     elif format in ["png", "svg"]:
--> 112         mimebundle = spec_to_mimebundle(
    113             spec=spec,
    114             format=format,

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair\utils\mimebundle.py in spec_to_mimebundle(spec, format, mode, vega_version, vegaembed_version, vegalite_version, **kwargs)
     58                 "see http://github.com/altair-viz/altair_saver/".format(fmt=format)
     59             )
---> 60         return altair_saver.render(spec, format, mode=mode, **kwargs)
     61     if format == "html":
     62         html = spec_to_html(

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair_saver\_core.py in render(chart, fmts, mode, embed_options, method, **kwargs)
    255         Saver = _select_saver(method, mode=mode, fmt=fmt)
    256         saver = Saver(spec, mode=mode, embed_options=embed_options, **kwargs)
--> 257         mimebundle.update(saver.mimebundle(fmt))
    258 
    259     return mimebundle

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair_saver\savers\_saver.py in mimebundle(self, fmts)
     88                 vegalite_version=self._package_versions["vega-lite"],
     89             )
---> 90             bundle[mimetype] = self._serialize(fmt, "mimebundle")
     91         return bundle
     92 

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair_saver\savers\_node.py in _serialize(self, fmt, content_type)
    112 
    113         if self._mode == "vega-lite":
--> 114             spec = self._vl2vg(spec)
    115 
    116         if fmt == "vega":

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\site-packages\altair_saver\savers\_node.py in _vl2vg(self, spec)
     66             [vl2vg], input=vl_json, stderr_filter=self._stderr_filter
     67         )
---> 68         return json.loads(vg_json)
     69 
     70     def _vg2png(self, spec: JSONDict) -> bytes:

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\json\__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    355             parse_int is None and parse_float is None and
    356             parse_constant is None and object_pairs_hook is None and not kw):
--> 357         return _default_decoder.decode(s)
    358     if cls is None:
    359         cls = JSONDecoder

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\json\decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~\AppData\Local\Continuum\anaconda3\envs\rwa\lib\json\decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 2 column 1 (char 2)

This seems to have been caused by a missing setup for the chromedriver.

It worked once I had installed and set up everything, validating by using an example that should open a Browser:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://jupyter.org/')

For me the steps were:

Now it works.

Posting here so future MEs will find it via Google.

@kannes kannes closed this as completed Feb 8, 2021
@kannes
Copy link
Contributor Author

kannes commented Feb 9, 2021

Next day, I got a JSONDecodeError again. It went away after I ran this test in the same Jupyter Notebook:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://seleniumhq.org/')

which opened a Browser window without issues. And then it even worked after completely restarting Jupyter Notebook (the whole process!). Makes no sense to me, I blame Windows.

@gregorhd
Copy link

Having the same issue in VSCode-Python, despite following your instructions. Same result if running from a Notebook or a Python script. Are there any other tricks one could try?

@kannes
Copy link
Contributor Author

kannes commented Jul 29, 2021

Some ideas:

  • Check if chromedriver.exe is in the PATH of your Python environment when running
  • Use some file access tracing tool to see where Python searches for it (no idea what tool does this on Windows, probably some sysinternals thing)

@gregorhd
Copy link

Thanks a mil @kannes. A print(os.environ) shows that the path to chromedriver.exe is there. Alright, I think I'm giving up on getting this to work :)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants