core icon indicating copy to clipboard operation
core copied to clipboard

MetaCall Ruby Runtime Crash with Python Integration

Open MoX678 opened this issue 4 months ago • 0 comments

MetaCall Ruby Runtime Crash with Python Integration

Expected Behavior

The main.js script should successfully load the Python module weather_analytics.py, execute the get_weather_stats function, and return the analytics data without crashing the Ruby runtime.

Current Behavior

when i run metacall main.js it loads files it crashes The logs show: A Python error: Module 'encoding' not found. A Ruby error: [BUG] Segmentation fault. changing package versions or deleting Ruby runtimes did not resolve the issue !

NOTES

If the following lines are moved to main.js, the crash occurs:

require("metacall");
const weather = require('../weather_analytics.py');
const analytics = await weather.get_weather_stats(weatherData);

or (another form that also causes the crash):

  const { metacall_load_from_file } = require("metacall");
  metacall_load_from_file("py", ["weather_analytics.py"]);

However, placing this same code in the handlers/weather-analyze module works correctly and loads the Python script without issues.

Error Logs

Python Initialization Module 'encoding' not found Error: Handle 0000000000000000 passed to metacall_handle_export is not valid Ruby Crash: Segmentation fault

* Loaded script: ruby

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 fiber.so
    3 rational.so
    4 complex.so
    5 ruby2_keywords.rb

Stack trace (most recent call last):
The specified module could not be found.

#31   Object "", at 00007FF91B0843F0, in  ??
#30   Object "", at 00007FF99AEE3970, in AES_cbc_encrypt
#29   Object "", at 00007FF99AF722CE, in AES_cbc_encrypt
#28   Object "", at 00007FF99A2E8070, in AES_cbc_encrypt
#27   Object "", at 00007FF99A2E820F, in AES_cbc_encrypt
#26   Object "", at 00007FF99A2E7E2A, in AES_cbc_encrypt
#25   Object "", at 00007FF99A2E839E, in AES_cbc_encrypt
#24   Object "", at 00007FF9993F764F, in AES_cbc_encrypt
#23   Object "", at 00007FFAD5439AC0, in node_loader_impl_load_from_memory
#22   Object "", at 00007FFAD56B78A8, in metacall_load_from_file
#21   Object "", at 00007FFAD56B3803, in loader_load_from_file
#20   Object "", at 00007FFAD56B54BF, in loader_impl_load_from_file
#19   Object "", at 00007FFAB26E316B, in rb_loader_impl_load_from_file
#18   Object "", at 00007FFAB26E3306, in rb_loader_impl_load_from_file
#17   Object "", at 00007FFA36066981, in rb_define_module
#16   Object "", at 00007FFA360841AC, in rb_raise
#15   Object "", at 00007FFA36084CAA, in rb_vraise
#14   Object "", at 00007FFA3607D32E, in rb_exc_raise
#13   Object "", at 00007FFA3607D304, in rb_error_write
#12   Object "", at 00007FFA3607D7AC, in rb_keyword_given_p
#11   Object "", at 00007FFA36052388, in rb_reserved_fd_p
#10   Object "", at 00007FFAEE7E5BDE, in KiUserExceptionDispatcher
#9    Object "", at 00007FFAEE6F45D7, in RtlWow64GetCurrentCpuArea
#8    Object "", at 00007FFAEE7E629F, in _chkstk
#7    Object "", at 00007FFAEBB51705, in _C_specific_handler_noexcept
#6    Object "", at 00007FFAEBB5156F, in _C_specific_handler
#5    Object "", at 00007FFAEBB8E235, in memcpy
#4    Object "", at 00007FFAEBB2E8A4, in seh_filter_exe
#3    Object "", at 00007FFA3619045E, in ruby_signal_name
#2    Object "", at 00007FFA3608330F, in rb_bug_for_fatal_signal
#1    Object "", at 00007FFA36081C8B, in ruby_stop
#0    Object "", at 00007FFAEBB44AB1, in abort

Code Snippets

Python: weather_analytics.py

import statistics
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
def get_weather_stats(weather_data):
    """Enhanced function using polynomial regression for better accuracy."""
    temps = [item["main"]["temp"] for item in weather_data["list"]]
    timestamps = np.arange(len(temps)).reshape(-1, 1)

    if len(temps) < 3:
        return {"error": "Not enough data to predict", "language": "Python"}

    # Use Polynomial Regression (degree 2 for better curve fitting)
    model = make_pipeline(PolynomialFeatures(degree=2), LinearRegression())
    model.fit(timestamps, temps)

    # Predict next day's temperature
    next_time_index = np.array([[len(temps)]])
    predicted_temp = round(model.predict(next_time_index)[0], 2)
    return {
        "average_temperature": round(np.mean(temps), 2),
        "max_temp": round(np.max(temps), 2),
        "min_temp": round(np.min(temps), 2),
        "predicted_temp_next_day": round(predicted_temp, 2),
        "trend": trend,
        "summary": weather_summary["summary"],   
        "condition": condition
    }

requirements.txt

numpy==1.23.5
scikit_learn==1.6.1

main.js

require("metacall");
const weather = require('../weather_analytics.py');
const analytics = await weather.get_weather_stats(weatherData);

Show Case

https://github.com/user-attachments/assets/6313bf7c-daf8-49f7-bc67-d43f4fd1c561

MoX678 avatar Jun 03 '25 04:06 MoX678