Pyscript ftplib Websocket issues in py-env

Hello Guys,
Just a heads up akismet for some reason flagged my last post as spam. However I found out the problem. I’m having another issue though.


I’m getting this error

close @ pyodide.asm.js:14
close @ pyodide.asm.js:14
close @ pyodide.asm.js:14
_fd_close @ pyodide.asm.js:14
$close @ pyodide.asm.wasm:0x5810f8
$func5042 @ pyodide.asm.wasm:0x2a989e
method_call_trampoline @ pyodide.asm.js:14
$func1175 @ pyodide.asm.wasm:0x13d44b
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9d9
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9ff
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9ff
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ffa4e
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9ff
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$_PyObject_FastCallDictTstate @ pyodide.asm.wasm:0x134d17
$_PyObject_Call_Prepend @ pyodide.asm.wasm:0x13552f
$func2435 @ pyodide.asm.wasm:0x1932a4
$func2336 @ pyodide.asm.wasm:0x18ad4c
method_call_trampoline @ pyodide.asm.js:14
$_PyObject_MakeTpCall @ pyodide.asm.wasm:0x134c2c
$func3167 @ pyodide.asm.wasm:0x201efe
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9d9
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$PyEval_EvalCode @ pyodide.asm.wasm:0x1f97a0
$func3089 @ pyodide.asm.wasm:0x1f6ad9
$func1957 @ pyodide.asm.wasm:0x174d8f
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff173
$func1364 @ pyodide.asm.wasm:0x1487f2
$func1385 @ pyodide.asm.wasm:0x14968c
$PyIter_Send @ pyodide.asm.wasm:0x121bcf
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1fc373
$func1364 @ pyodide.asm.wasm:0x1487f2
$func1356 @ pyodide.asm.wasm:0x147ef7
$func1386 @ pyodide.asm.wasm:0x14969a
method_call_trampoline @ pyodide.asm.js:14
$func1176 @ pyodide.asm.wasm:0x13d52c
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9ff
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func1080 @ pyodide.asm.wasm:0x136cde
$func3330 @ pyodide.asm.wasm:0x217a98
$func1954 @ pyodide.asm.wasm:0x174a14
$PyVectorcall_Call @ pyodide.asm.wasm:0x135149
$_PyObject_Call @ pyodide.asm.wasm:0x135243
$PyObject_Call @ pyodide.asm.wasm:0x1352e6
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1fff83
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9ff
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$_pyproxy_apply @ pyodide.asm.wasm:0xf16d8
Module.callPyObjectKwargs @ pyproxy.gen.ts:360
Module.callPyObject @ pyproxy.gen.ts:384
wrapper @ pyodide.asm.js:14
setTimeout (async)
hiwire_call_bound @ pyodide.asm.js:14
$func380 @ pyodide.asm.wasm:0xef536
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff173
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func1080 @ pyodide.asm.wasm:0x136c6e
$PyVectorcall_Call @ pyodide.asm.wasm:0x135186
$_PyObject_Call @ pyodide.asm.wasm:0x135243
$PyObject_Call @ pyodide.asm.wasm:0x1352e6
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1fff83
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func1080 @ pyodide.asm.wasm:0x136c6e
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ffa4e
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$_PyObject_FastCallDictTstate @ pyodide.asm.wasm:0x134d4d
$_PyObject_Call_Prepend @ pyodide.asm.wasm:0x13552f
$func2435 @ pyodide.asm.wasm:0x1932a4
$func2336 @ pyodide.asm.wasm:0x18ad4c
method_call_trampoline @ pyodide.asm.js:14
$_PyObject_MakeTpCall @ pyodide.asm.wasm:0x134c2c
$func3167 @ pyodide.asm.wasm:0x201efe
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ffa4e
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ff9ff
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$func3167 @ pyodide.asm.wasm:0x201f1b
$_PyEval_EvalFrameDefault @ pyodide.asm.wasm:0x1ffa4e
$_PyEval_Vector @ pyodide.asm.wasm:0x1f98b5
$_PyFunction_Vectorcall @ pyodide.asm.wasm:0x135329
$PyObject_VectorcallMethod @ pyodide.asm.wasm:0x135c47
$_pyproxy_ensure_future @ pyodide.asm.wasm:0xf1aa9
_ensure_future @ pyproxy.gen.ts:1053
Module.callPyObjectKwargs @ pyproxy.gen.ts:379
Module.callPyObject @ pyproxy.gen.ts:384
apply @ pyproxy.gen.ts:1145
apply @ pyproxy.gen.ts:1022
(anonymous) @ api.ts:181
(anonymous) @ tslib.es6.js:76
__awaiter @ tslib.es6.js:72
runPythonAsync @ api.ts:167
evaluate @ base.ts:90
pyodide.asm.js:14 Element.write: PythonError: Traceback (most recent call last):
  File "/lib/python3.10/asyncio/futures.py", line 201, in result
    raise self._exception
  File "/lib/python3.10/asyncio/tasks.py", line 232, in __step
    result = coro.send(None)
  File "/lib/python3.10/site-packages/_pyodide/_base.py", line 500, in eval_code_async
    await CodeRunner(
  File "/lib/python3.10/site-packages/_pyodide/_base.py", line 351, in run_async
    coroutine = eval(self.code, globals, locals)
  File "<exec>", line 12, in <module>
  File "/lib/python3.10/ftplib.py", line 121, in __init__
    self.connect(host)
  File "/lib/python3.10/ftplib.py", line 158, in connect
    self.sock = socket.create_connection((self.host, self.port), self.timeout,
  File "/lib/python3.10/socket.py", line 845, in create_connection
    raise err
  File "/lib/python3.10/socket.py", line 833, in create_connection
    sock.connect(sa)
BlockingIOError: [Errno 26] Operation in progress
 --> True

my code is on my github if i’m allowed to post it without being flagged by akismet.

It looks like the code you’re using (ftplib in some way, yes?) makes uses of Python’ssocket package?That’s what’s I’d assume from the line File "/lib/python3.10/socket.py", line 833, in create_connection sock.connect(sa).

Unfortunately, native sockets (as in the sockets package) don’t work in PyScript/Pyodide - they rely on low-level networking features that are available in the typical environments CPython runs in, but not within the sandbox of a browser window.

There is the WebSockets API, but it’s not a 1:1 drop in for sockets, and would need quite a bit of integration to use underneath something like ftp.

Hey Jeff,
No the line of code is here

import pandas as pd 
import ftplib
from pyodide import create_proxy, to_js
from js import chartasm
from pyodide import create_proxy



ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)

ftp_server.encoding = "utf-8"

filename = "public_html//reports//abba//data//ReportGraphC.csv"

file = "ReportGraphC.csv"

    # Command for Downloading the file "RETR filename"
ftp_server.retrbinary(f"RETR {filename}", open(file, "wb").write)

file= open(file, "r")

DF_REPGRH = pd.DataFrame(data=file)

ARRAY_REPGRH = pd.array(DF_REPGRH[0][1:5])

ARRAY_GRHC = []

def JS_ARRAY():

    for i in range(len(ARRAY_REPGRH)):
        NEW_ELEMENT = ARRAY_REPGRH[i].replace("\n", "")

        ARRAY_GRHC.append(NEW_ELEMENT)

    updateChart(to_js(ARRAY_GRHC))

proxy = create_proxy(JS_ARRAY)

JS_ARRAY

I’m trying to pull a file from an ftp server and display the information in a bar chart.

However it’s giving me the error above

Thank you!
@JeffGlass

I think we’re in agreement here - ftplib does indeed us the socket library under the hood, as you can see here, and within the browser, sockets have the limitations I mentioned above. So you may be looking at needing to develop a way to shim the FTP connection using WebSockets or similar.