Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
176 views
in Technique[技术] by (71.8m points)

java - JavaObject from Netlogo has no length using py4j?

I am running nl4py (a python module for NetLogo) in Jupyter notebook. I am trying to get import a list from netlogo into python, but the import is in a Java format. However, when I try to convert the JavaObject to a python format using py4j I get an error of: JavaObject has no len(). Is there a better way to convert JavaObject in python? Thanks.

python 3.8, ipython 7.10.0, nl4py 0.5.0, jdk 15.0.2, Netlogo 6.0, MacOS Catalina 10.15.7

#start of code for nl4py
import nl4py
nl4py.startServer("/Applications/NetLogo 6.0/")
n = nl4py.NetLogoApp()

n.openModel('/Users/tracykuper/Desktop/Netlogo models/Mucin project/1_21_20/PA_metabolite_model_1_21.nlogo')

n.command("setup")

#run abm model for n number of times
#change patch variable under a specific turtle
for i in range(1):
    n.command("repeat 10 [go]")
#A = np.array([1,2,3,4],[3,2,-1,-6])) #turtle number, metabolite diff.

#run simulation of metabolic network to get biomass and metabolite values

    
    #change patch variable under a specific turtle
    names = ["1", "2", "3"] #turtle names
    patch_values = ["-0.5", "50", "-0.5"] #metabolite values
    for i in range(len(names)):
        x = ('ask turtle {} [ask patch-here [set succinate succinate + {}]]'.format(names[i],patch_values[i]))
        n.command(x)  
        
    #set new bacteria mass values
        values = ["5", "30", "5"] #biomass values
        y = ('ask turtle {} [set m m + {}]'.format(names[i],values[i]))
        n.command(y)
        n.command("ask turtle {} [set color red]".format(names[i]))

import py4j 
mass = n.report("mass-list") 
print(mass) 
self = n.report("self-list") 
type(mass)

s = py4j.protocol.get_return_value(mass, object)

[[0.69], [0.8], [0.73], [0.71], [0.5], [0.51], [0.54], [0.82], [0.72], [0.88]]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-31-0b04d0127b47> in <module>
     11 #map(mass + mass,mass)
     12 
---> 13 s = py4j.protocol.get_return_value(mass, object)

~/opt/anaconda3/envs/netlogo4/lib/python3.6/site-packages/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
    319         (e.g., *hello* in `object1.hello()`). Optional.
    320     """
--> 321     if is_error(answer)[0]:
    322         if len(answer) > 1:
    323             type = answer[1]

~/opt/anaconda3/envs/netlogo4/lib/python3.6/site-packages/py4j/protocol.py in is_error(answer)
    372 
    373 def is_error(answer):
--> 374     if len(answer) == 0 or answer[0] != SUCCESS:
    375         return (True, None)
    376     else:

TypeError: object of type 'JavaObject' has no len()
question from:https://stackoverflow.com/questions/65905538/javaobject-from-netlogo-has-no-length-using-py4j

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...