5
$\begingroup$

I'm trying to deploy a simple Quantum App written using Python on Heroku Server which is also using Microsoft's Q#, but getting the below error:

AttributeError: module 'qsharp' has no attribute 'clients'
Traceback:
File "/app/.heroku/python/lib/python3.6/site-packages/streamlit/script_runner.py", line 332, in _run_script
    exec(code, module.__dict__)
File "/app/qrng_final.py", line 18, in <module>
    import qsharp
File "/app/.heroku/python/lib/python3.6/site-packages/qsharp/__init__.py", line 123, in <module>
    client = _start_client()
File "/app/.heroku/python/lib/python3.6/site-packages/qsharp/clients/__init__.py", line 31, in _start_client
    client = qsharp.clients.iqsharp.IQSharpClient()

Log from the docker image:

ovyan@7ca97f8365fb: /appjovyan@7ca97f8365fb:/app$ ls
Dockerfile  Operation.qs  README.md  qrng_final.py     runtime.txt
LICENSE     Procfile      obj        requirements.txt  setup.sh
ovyan@7ca97f8365fb: /appjovyan@7ca97f8365fb:/app$ ls $HOME/.local/bin
base58     f2py3         pip3             pybind11-config  virtualenv
cygdb      f2py3.7       pip3.7           sample           virtualenv-clone
cython     get_objgraph  pipenv           streamlit        watchmedo
cythonize  isympy        pipenv-resolver  streamlit.cmd
f2py       pip           plasma_store     undill
ovyan@7ca97f8365fb: /appjovyan@7ca97f8365fb:/app$ ls $HOME/.local/binls $HOME/.local/bin $HOME/.local/bin $HOME/.local/binc $HOME/.local/bind $HOME/.local/bin $HOME/.local/bin$HOME/.local/bin
ovyan@7ca97f8365fb: ~/.local/binjovyan@7ca97f8365fb:~/.local/bin$ ls streamlit
streamlit
ovyan@7ca97f8365fb: ~/.local/binjovyan@7ca97f8365fb:~/.local/bin$ ls streamlit/streamltit
ls: cannot access 'streamlit/streamlit': Not a directory
ovyan@7ca97f8365fb: ~/.local/binjovyan@7ca97f8365fb:~/.local/bin$ ls streamlit/streamlit streamlit/streamlit streamlit/streamlitc streamlit/streamlita streamlit/streamlitt streamlit/streamlit
cat: streamlit/streamlit: Not a directory
ovyan@7ca97f8365fb: ~/.local/binjovyan@7ca97f8365fb:~/.local/bin$ cat steeamlit
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from streamlit.cli import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
ovyan@7ca97f8365fb: ~/.local/binjovyan@7ca97f8365fb:~/.local/bin$ cd ..
ovyan@7ca97f8365fb: ~/.localjovyan@7ca97f8365fb:~/.local$ vfcf f ..cd /app
ovyan@7ca97f8365fb: /appjovyan@7ca97f8365fb:/app$ ls
Dockerfile  Operation.qs  README.md  qrng_final.py     runtime.txt
LICENSE     Procfile      obj        requirements.txt  setup.sh
ovyan@7ca97f8365fb: /appjovyan@7ca97f8365fb:/app$ $HOME/.local/bin/streamlit run qrng_final.py 
2021-02-06 23:56:11.279 
Warning: the config option 'server.enableCORS=false' is not compatible with 'server.enableXsrfProtection=true'.
As a result, 'server.enableCORS' is being overridden to 'true'.

More information:
In order to protect against CSRF attacks, we send a cookie with each request.
To do so, we must specify allowable origins, which places a restriction on
cross-origin resource sharing.

If cross origin resource sharing is required, please disable server.enableXsrfProtection.
            
2021-02-06 23:56:13.041 
Warning: the config option 'server.enableCORS=false' is not compatible with 'server.enableXsrfProtection=true'.
As a result, 'server.enableCORS' is being overridden to 'true'.

More information:
In order to protect against CSRF attacks, we send a cookie with each request.
To do so, we must specify allowable origins, which places a restriction on
cross-origin resource sharing.

If cross origin resource sharing is required, please disable server.enableXsrfProtection.
            

  You can now view your Streamlit app in your browser.

  Network URL: http://172.17.0.2:8501
  External URL: http://106.51.241.244:8501

/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:107: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  z = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:108: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  x = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:107: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  z = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:108: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  x = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:107: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  z = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:108: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  x = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:107: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  z = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:108: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  x = np.zeros(len(label), dtype=np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
/home/jovyan/.local/lib/python3.7/site-packages/qiskit/quantum_info/operators/pauli.py:30: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  arr = np.asarray(arr).astype(np.bool)
2021-02-06 23:56:17.792 Starting IQ# kernel...
2021-02-06 23:56:23.896 Exception while checking if IQ# is ready.
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/qsharp/clients/iqsharp.py", line 97, in is_ready
    result = self.component_versions(timeout=6)
  File "/usr/local/lib/python3.7/site-packages/qsharp/clients/iqsharp.py", line 193, in component_versions
    self._execute("%version", output_hook=capture, _quiet_=True, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/qsharp/clients/iqsharp.py", line 270, in _execute
    reply = self.kernel_client.execute_interactive(input, output_hook=_output_hook, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/jupyter_client/blocking/client.py", line 321, in execute_interactive
    raise TimeoutError("Timeout waiting for output")
TimeoutError: Timeout waiting for output
Preparing Q# environment...
2021-02-06 23:56:27.619 Q# version
{'iqsharp': LooseVersion ('0.15.2101126940'), 'Jupyter Core': LooseVersion ('1.5.0.0'), '.NET Runtime': LooseVersion ('.NETCoreApp,Version=v3.1')}

I have already given Q#package name in requirements.txt but still not able to resolve it. Is there any solution around how can I install Q# binded with Python on any remote server?

$\endgroup$
3
$\begingroup$

I believe that Heroku does not currently support installing additional software, such as the IQ# kernel used by the qsharp Python package. That said, Heroku's documentation suggests that using Docker can allow for providing additional dependencies. The Quantum Development Kit is published along with a Docker image, iqsharp-base, that provides everything you need to use Q# and Python together within a Docker environment:

FROM mcr.microsoft.com/quantum/iqsharp-base:0.15.2101125897
$\endgroup$
6
  • $\begingroup$ Hey Chris, I tried Docker as well, but with this docker image I don't have access as a root user because of which not able to install other packages at the default location $\endgroup$ Feb 3 at 15:08
  • $\begingroup$ The iqsharp-base Docker image is designed for use with tools like mybinder.org which require running as non-root users, but that can be overridden by using the USER command in a Dockerfile that inherits FROM mcr.microsoft.com/quantum/iqsharp-base:0.15.2101125897. Alternatively, you can see the code we used to build that image at github.com/microsoft/iqsharp/blob/main/images/iqsharp-base/…. $\endgroup$ Feb 3 at 15:57
  • $\begingroup$ I tried creating a Doker image using this file as well, but it's throwing some error at Line 97. Any changes you suggest in the below docker file which overrides the jovyan user and installs my dependencies as root user? github.com/shadab-entrepreneur/… $\endgroup$ Feb 6 at 23:18
  • $\begingroup$ Also I have added logs from the docker image, see if you can help out $\endgroup$ Feb 7 at 0:00
  • 1
    $\begingroup$ I didn't see the logs, but looking at github.com/shadab-entrepreneur/…, line 10 fails as the current user set by the FROM line is still jovyan. To override and get back to root, you need a USER root command to appear above the Docker commands that you want to run as root. $\endgroup$ Feb 8 at 2:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.