I tried loading adafruit_ads1x15.analog_in via importlib.import_module and it works fine, see attached power_monitor_rpi.py.txt below.
When you run the script, the globals data shows:
'adafruit_extended_bus': <module 'adafruit_extended_bus' from '/home/pi/.local/lib/python3.7/site-packages/adafruit_extended_bus.py'>,
'adafruit_ads1x15.analog_in': <module 'adafruit_ads1x15.analog_in' from '/home/pi/.local/lib/python3.7/site-packages/adafruit_ads1x15/analog_in.py'>,
'adafruit_ads1x15': <module 'adafruit_ads1x15' from '/home/pi/.local/lib/python3.7/site-packages/adafruit_ads1x15/__init__.py'>}
The first two packages point to the lowest level .py file with code in them, but the adafruit_ads1x15 points to an (empty) --init–.py file.
I have asked the Adafruit people on github to take another look.
# script that runs on Raspberry Pi to monitor A-D converter inputs
# inputs to be monitore are defined in xxx_rc config file
# written by John Brearley, Jan 2021 brearley@bell.net
# core item, cant load from dynamic list below.
import importlib
# import required packages from pkg_list
pkg_list=["sys", "time", "traceback", "board", "busio",
"adafruit_extended_bus", "adafruit_ads1x15.analog_in", "print_data"]
error_list = []
for pkg in pkg_list:
print("importing pkg: ", pkg)
try:
globals()[pkg] = importlib.import_module(pkg)
except:
error_list.append(pkg)
(x,y,z)=sys.exc_info()
print("ERROR: pkg:", pkg, "msg:", y)# y is root error msg
# traceback.print_exc() # gives all info, more verbose
if len(error_list) == 0:
print("Loaded packages OK:", pkg_list)
else:
print("ERROR: FAILED to load packages:", error_list)
sys.exit(1)
# One package does NOT load properly via importlib.import_module.
# NB: adafruit_ads1x15.analog_in DOES load OK via importlib.import_module.
try:
import adafruit_ads1x15.ads1115
print ("Loaded packages OK: adafruit_ads1x15.ads1115")
except:
(x,y,z)=sys.exc_info()
print("ERROR: misc pkg:", y)# y is root error msg
sys.exit(1)
print("\n\nglobals:", globals(),"\n\n")
# Create two I2C bus, default & custom #4 per /boot/config.txt
i2c_1 = busio.I2C(board.SCL, board.SDA)
# print_data.print_data(i2c_1)
i2c_4 = adafruit_extended_bus.ExtendedI2C(4) # custom #4 per /boot/config.txt
# Create the ADC objects using two I2C bus
print_data.print_data(adafruit_ads1x15.ads1115.ADS1115)
ads10 = adafruit_ads1x15.ads1115.ADS1115(i2c_1, address=0x48)
print_data.print_data(ads10)
ads13 = adafruit_ads1x15.ads1115.ADS1115(i2c_1, address=0x4b)
print_data.print_data(ads13)
ads40 = adafruit_ads1x15.ads1115.ADS1115(i2c_4, address=0x48)
print_data.print_data(ads40)
# Create single-ended inputs on i2c-1 bus
ch1_48_0 = adafruit_ads1x15.analog_in.AnalogIn(ads10, adafruit_ads1x15.ads1115.P0)
ch1_48_1 = adafruit_ads1x15.analog_in.AnalogIn(ads10, adafruit_ads1x15.ads1115.P1)
ch1_48_2 = adafruit_ads1x15.analog_in.AnalogIn(ads10, adafruit_ads1x15.ads1115.P2)
ch1_48_3 = adafruit_ads1x15.analog_in.AnalogIn(ads10, adafruit_ads1x15.ads1115.P3)
ch1_4b_0 = adafruit_ads1x15.analog_in.AnalogIn(ads13, adafruit_ads1x15.ads1115.P0)
ch1_4b_1 = adafruit_ads1x15.analog_in.AnalogIn(ads13, adafruit_ads1x15.ads1115.P1)
ch1_4b_2 = adafruit_ads1x15.analog_in.AnalogIn(ads13, adafruit_ads1x15.ads1115.P2)
ch1_4b_3 = adafruit_ads1x15.analog_in.AnalogIn(ads13, adafruit_ads1x15.ads1115.P3)
# Create single-ended inputs on i2c-4 bus
ch4_48_0 = adafruit_ads1x15.analog_in.AnalogIn(ads40, adafruit_ads1x15.ads1115.P0)
ch4_48_1 = adafruit_ads1x15.analog_in.AnalogIn(ads40, adafruit_ads1x15.ads1115.P1)
ch4_48_2 = adafruit_ads1x15.analog_in.AnalogIn(ads40, adafruit_ads1x15.ads1115.P2)
ch4_48_3 = adafruit_ads1x15.analog_in.AnalogIn(ads40, adafruit_ads1x15.ads1115.P3)
# Create differential input between channel 0 and 1
#chan = AnalogIn(ads, ADS.P0, ADS.P1)
# ch = [ch0, ch1, ch2, ch3]
print ("I2C Addr P Volts P Volts P Volts P Volts")
print ("====== ==== = ======== = ======== = ======== = ========")
while True:
try:
# for i,var in enumerate(ch):
# print ("i:",i,"var:",var)
print("I2C: 1 0x48 0 {:>8.5f} 1 {:>8.5f} 2 {:>8.5f} 3 {:>8.5f}".format(ch1_48_0.voltage, ch1_48_1.voltage, ch1_48_2.voltage, ch1_48_3.voltage))
print("I2C: 1 0x4b 0 {:>8.5f} 1 {:>8.5f} 2 {:>8.5f} 3 {:>8.5f}".format(ch1_4b_0.voltage, ch1_4b_1.voltage, ch1_4b_2.voltage, ch1_4b_3.voltage))
print("I2C: 4 0x48 0 {:>8.5f} 1 {:>8.5f} 2 {:>8.5f} 3 {:>8.5f}".format(ch4_48_0.voltage, ch4_48_1.voltage, ch4_48_2.voltage, ch4_48_3.voltage))
time.sleep(0.5)
except KeyboardInterrupt:
print("\n\nexiting.")
break
except:
print("Start exception handler")
traceback.print_exc()
print("End exception handler")
# values[i] = adc.read_adc(i, gain=GAIN)