New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
leoBridge commander open Leo-Editor file always fails #534
Comments
Fails with latest version. Test Version
|
I'll look into immediately. Bisecting gave 83575d4 that chaned bridge.getLeoID() |
Fixed at 821c750. Tested by script of @SegundoBob |
Thanks. Revision 821c750 works for me. |
On Sat, Jul 22, 2017 at 12:59 PM, Виталије Милошевић < ***@***.***> wrote:
Fixed at 821c750
<821c750>.
Tested by script of @SegundoBob <https://github.com/segundobob>
Thanks, Vitalije. It must have been I who broke the code.
Edward
|
Hi to all, I saw yesterday the need for adding some nodes to a Leo document by running an script from outside Leo and today I've seen that this issue has something to do with it and has just been fixed, so I've tried to run the @SegundoBob script as a first test, but I got this error: D:\proj\code\leo\scripts>python.exe leoBridgeOpen.py hello.leo
Traceback (most recent call last):
File "leoBridgeOpen.py", line 4, in <module>
import leo.core.leoBridge as leoBridge
ModuleNotFoundError: No module named 'leo' It seems logical because I have not installed leo as a module in my Python installation, so I've made a search on the question at Leo site and found the page about leoBridge. But, as incredible as it may seem, the first chapter in that page gives a basic example which is nearly identicall to @SegundoBob example, but no clue as how one should make "leo" module reachable in the first place from outside Leo. And I've seen no setup.py file in the root folder of Leo installation either, so I don't know how should I do it. Is there any documentation about this in Leo web site that I'm missing? |
On Mon, 24 Jul 2017 18:29:49 -0700 XGiD ***@***.***> wrote:
Hi to all,
I saw yesterday the need for adding some nodes to a Leo document by
running an script from outside Leo and today I've seen that this
issue has something to do with it and has just been fixed, so I've
tried to run the @SegundoBob script as a first test, but I got this
error: ```python D:\proj\code\leo\scripts>python.exe leoBridgeOpen.py
hello.leo Traceback (most recent call last): File "leoBridgeOpen.py",
line 4, in <module> import leo.core.leoBridge as leoBridge
ModuleNotFoundError: No module named 'leo' ```
You're using Windows, so
set PYTHONPATH=D:\path\to\location\of\folder\leo
python D:\proj\code\leo\scripts>python.exe leoBridgeOpen.py hello.leo
might work.
Cheers -Terry
… It seems logical because I have not installed leo as a module in my
Python installation, so I've [made a search on the
question](https://www.google.com/search?q=site:leoeditor.com+bridge)
at Leo site and found [the page about
leoBridge](http://leoeditor.com/leoBridge.html). But, as incredible
as it may seem, the first chapter in that page gives a basic example
which is nearly identicall to @SegundoBob example, but no clue as how
one should make "leo" module reachable in the first place from
outside Leo. And I've seen no **setup.py** file in the root folder of
Leo installation either, so I don't know how should I do it.
Is there any documentation about this in Leo web site that I'm
missing?
|
Thanks Terry, it worked. Anyway, shouldn't it be documented somewhere in the docs? It is not evident for any end user that installing Leo does not install leo modules in your current python installation. By the other side: should it be better to have a Xavier |
Oh, and another question: would leoBridge allow me to dinamically add nodes to an already opened Leo document? |
On Wed, Jul 26, 2017 at 11:27 PM, XGiD ***@***.***> wrote:
Oh, and another question: would leoBridge allow me to dynamically add
nodes to an already opened Leo document?
Yes. And save the document too ;-)
Edward
|
On Wed, 26 Jul 2017 22:27:34 -0700 XGiD ***@***.***> wrote:
Oh, and another question: would leoBridge allow me to dinamically add
nodes to an already opened Leo document? I mean to add nodes to a Leo
document from outside Leo while I have the document open in Leo
editor.
But you can communicate with a running Leo using the mod_http.py
plugin. I use it primarily to load text files from the command line
and save book marks from a web browser, but there's no limit on what
you can make the running Leo do.
https://github.com/leo-editor/snippets/blob/master/utils/led.sh is a
bash script for making a remote Leo load a text file, it could be
written in Python too, basically it's using curl to send code to be
executed to http://localhost:8130/_/exec/, I think the basic form is
http://localhost:8130/_/exec/?cmd=nd=c.p.addAsLastChild()&cmd=nd.h='new node'
but there are url encoding issues etc. in there.
http://localhost:8130/_/exec/?cmd=nd%3dc.p.addAsLastChild()&cmd=nd.h%3d'new%20node'
would be closer.
Cheers -Terry
|
On Thu, 27 Jul 2017 14:45:41 -0700
"Edward K. Ream" <notifications@github.com> wrote:
On Wed, Jul 26, 2017 at 11:27 PM, XGiD ***@***.***>
wrote:
> Oh, and another question: would leoBridge allow me to dynamically
> add nodes to an already opened Leo document?
>
Yes. And save the document too ;-)
Edward
This answer's only correct because of over zealous snipping in the
quote :-) By going on to say
I mean to add nodes to a Leo document from outside Leo while I have
the document open in Leo editor.
Xavier clearly wants to change an outline open in a Leo GUI instance
from code triggered outside that instance. The leoserver plugin used
to do that, but got retired, mod_http supports that function now.
Cheers -Terry
|
Thanks to all for your answers.
Exactly, that's the idea! So I've tried the mod_http trick but got this error shown in the Log pane: 127.0.0.1 - - [28/Jul/2017 13:30:55] "GET /?cmd=g.es%28%27Test%20message%21%27%29 HTTP/1.1" 404 -
Traceback (most recent call last):
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 421, in send_head
f = self.leo_actions.get_response()
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 903, in get_response
return self.exec_handler.get_response()
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 935, in get_response
ans = self.proc_cmds()
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 969, in proc_cmds
ans = valuespace.eval_text(g.app.commanders()[c_idx], cmd)
File "C:\dev\Leo-5.4\leo\plugins\valuespace.py", line 367, in eval_text
vsc = get_vs(c)
File "C:\dev\Leo-5.4\leo\plugins\valuespace.py", line 299, in get_vs
return controllers[c.hash()]
KeyError: 'd:\\proj\\code\\devenv\\devenv.leo'
error: uncaptured python exception, closing channel <leo.plugins.mod_http.RequestHandler connected 127.0.0.1:53148 at 0xeb77210> (<class 'KeyError'>:'d:\\proj\\code\\devenv\\devenv.leo' [C:\dev\Leo-5.4\leo\plugins\mod_http.py|a_read|1185] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|handle_read_event|1112] [C:\dev\Anaconda3.6\lib\asyncore.py|handle_read_event|423] [C:\dev\Anaconda3.6\lib\asynchat.py|handle_read|171] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|found_terminator|1142] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|handle_request_line|1131] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|do_GET|1068] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|handle_data|1106] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|send_head|421] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|get_response|903] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|get_response|935] [C:\dev\Leo-5.4\leo\plugins\mod_http.py|proc_cmds|969] [C:\dev\Leo-5.4\leo\plugins\valuespace.py|eval_text|367] [C:\dev\Leo-5.4\leo\plugins\valuespace.py|get_vs|299]) As you can see, the cmd I was trying to run was just
Should I open a bug report about that or am I doing anything wrong? (For the record, accessing the plain URL By the other side, I have also tried to run a very basic script using leoBridge (as I have another use case where it may be helpful) and I must say that it is not working as I initially thought. This basic script: import sys
import leo.core.leoBridge as leoBridge
def main():
""" Module entry point
"""
bridge = leoBridge.controller(gui='nullGui', silent=False,
verbose=False, loadPlugins=True, readSettings=True)
g = bridge.globals()
print('g: ' + repr(g))
print('bridge.isOpen: ' + str(bridge.isOpen()))
c = bridge.openLeoFile(sys.argv[1])
print('bridge.openLeoFile({0}) returned {1}'.format(sys.argv[1], c))
print(c.p)
if __name__ == "__main__":
main() Gives this output:
|
On Fri, 28 Jul 2017 13:29:56 -0700 XGiD ***@***.***> wrote:
Thanks to all for your answers.
> Xavier clearly wants to change an outline open in a Leo GUI
> instance from code triggered outside that instance. The leoserver
> plugin used to do that, but got retired, mod_http supports that
> function now.
Exactly, that's the idea! So I've tried the mod_http trick but got
this error shown in the Log pane:
Hmm, your url worked for me. I assume you've read this bit:
**Warning**:
Allowing remote code execution is a **HUGE SECURITY HOLE**, you need to
be sure that the url from which you access Leo (typically
http://localhost:8130/) is accessible only by people and software you trust.
Remote execution is turned off by default, you need to manually / locally
change the @setting ``@bool http_allow_remote_exec = False`` to ``True``
to enable it.
and adjusted settings appropriately. Also perhaps enable the
valuespace plugin, I suspect it's executing things in that namespace
and probably enables it itself, but it might make a difference vs.
being in enable-plugins.
I'd have to look at the code more to get further.
Cheers -Terry
… ```python
127.0.0.1 - - [28/Jul/2017 13:30:55]
"GET /?cmd=g.es%28%27Test%20message%21%27%29 HTTP/1.1" 404 -
Traceback (most recent call last):
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 421, in
send_head f = self.leo_actions.get_response()
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 903, in
get_response return self.exec_handler.get_response()
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 935, in
get_response ans = self.proc_cmds()
File "C:\dev\Leo-5.4\leo\plugins\mod_http.py", line 969, in
proc_cmds ans = valuespace.eval_text(g.app.commanders()[c_idx], cmd)
File "C:\dev\Leo-5.4\leo\plugins\valuespace.py", line 367, in
eval_text vsc = get_vs(c)
File "C:\dev\Leo-5.4\leo\plugins\valuespace.py", line 299, in get_vs
return controllers[c.hash()]
KeyError: 'd:\\proj\\code\\devenv\\devenv.leo'
error: uncaptured python exception, closing channel
<leo.plugins.mod_http.RequestHandler connected 127.0.0.1:53148 at
0xeb77210> (<class
0xeb77210> 'KeyError'>:'d:\\proj\\code\\devenv\\devenv.leo' [C:\dev\Leo-5.4\leo\plugins\mod_http.py|a_read|1185]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|handle_read_event|1112]
0xeb77210> [C:\dev\Anaconda3.6\lib\asyncore.py|handle_read_event|423]
0xeb77210> [C:\dev\Anaconda3.6\lib\asynchat.py|handle_read|171]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|found_terminator|1142]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|handle_request_line|1131]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|do_GET|1068]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|handle_data|1106]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|send_head|421]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|get_response|903]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|get_response|935]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\mod_http.py|proc_cmds|969]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\valuespace.py|eval_text|367]
0xeb77210> [C:\dev\Leo-5.4\leo\plugins\valuespace.py|get_vs|299]) ```
As you can see, the cmd I was trying to run was just `cmd=g.es('Test
message!')`, so the full URL was: ```
http://localhost:8130/_/exec/?cmd=g.es%28%27Test%20message%21%27%29
```
Should I open a bug report about that or am I doing anything wrong?
(For the record, accessing the plain URL `http://localhost:8130` does
properly show the list of open files in the Leo GUI instance).
By the other side, I have also tried to run a very basic script using
leoBridge (as I have another use case where it may be helpful) and I
must say that it is not working as I initially thought.
This basic script:
```python
import sys
import leo.core.leoBridge as leoBridge
def main():
""" Module entry point
"""
bridge = leoBridge.controller(gui='nullGui', silent=False,
verbose=False, loadPlugins=True, readSettings=True)
g = bridge.globals()
print('g: ' + repr(g))
print('bridge.isOpen: ' + str(bridge.isOpen()))
c = bridge.openLeoFile(sys.argv[1])
print('bridge.openLeoFile({0}) returned {1}'.format(sys.argv[1],
c))
print(c.p)
if __name__ == "__main__":
main()
```
Gives this output:
```
g: False
bridge.isOpen: False
bridge.openLeoFile(D:\proj\code\leo\scripts\hello.leo) returned None
Traceback (most recent call last):
File "leoBridgeOpen.py", line 22, in <module>
main()
File "leoBridgeOpen.py", line 19, in main
print(c.p)
AttributeError: 'NoneType' object has no attribute 'p'
```
|
Thanks Terry, now it works! I already had the Any idea about the leoBridge module errors? |
On Fri, 28 Jul 2017 23:58:56 +0000 (UTC) XGiD ***@***.***> wrote:
Thanks Terry, now it works!
I already had the ***@***.*** http_allow_remote_exec = True`, but did not
have the valuespace plugin enabled in my ***@***.***`. It seems
to be necessary. Should it be documented somewhere?
Yes, it seems mod_http is trying to use valuespace directly (it was in
the traceback), but for some reason it's not working with the plugin
not enabled. So it should be in the docs.
Any idea about the leoBridge module errors?
If you mean having leo.* on the PYTHONPATH, I guess the easy fix is
again docs. for leoServer. I'm not sure of the status of a Leo
"system level" install that puts leo on the PYTHONPATH globally. The
existing setup.py is perhaps used for building an .rpm or something for
Ubuntu distributions, I'm not sure we have a regular Python package
install setup.py.
Cheers -Terry
|
Thanks Terry. Specifically:
So leoBridge is not working at all for me. I've also tried with the examples at leoeditor.com with similar results. Xavier |
@xgid which revision do you use? |
Oh, of course!
|
suggests that you have copied version data from Leo log. Please provide copy of all output generated by your script from command line. When starting leoBridge there is no PyQt version but I can't reproduce behavior that you have reported. Perhaps you are not using same version in leoBridge and normal Leo application. Otherwise I have no idea what to check else. |
Well, the problem is that the output I provided in my previous comment is all the output I get from running my script. Even if I set How can I get any other output for my script? |
Please pay attention to the line that I quoted. It seems that the log you have copied did not originate from console and script that was using |
When I say all the output, I mean Leo version details. You have send them here in another message not the one you pointed in your last message. |
I'm sorry I have not been clear enough, there was too much info in the message I pointed to. To make it clear again: With this exact script: import sys
import leo.core.leoBridge as leoBridge
def main():
""" Module entry point
"""
bridge = leoBridge.controller(gui='nullGui', silent=False,
verbose=True, loadPlugins=True, readSettings=True)
g = bridge.globals()
print('g: ' + repr(g))
print('bridge.isOpen: ' + str(bridge.isOpen()))
c = bridge.openLeoFile(sys.argv[1])
print('bridge.openLeoFile({0}) returned {1}'.format(sys.argv[1], c))
print(c.p)
if __name__ == "__main__":
main() This is exactly the output I get in the command line:
No more and no less! |
And this is my current version of Leo, of course copied from the Log pane of a normal Qt GUI instance of Leo because I cannot get if from the command line!
|
Please change your script to the following: import sys
print('\n'.join(sys.path))
import leo
print('leo path', leo.__file__)
import leo.core.leoBridge as leoBridge
def main():
""" Module entry point
"""
bridge = leoBridge.controller(gui='nullGui', silent=False,
verbose=True, loadPlugins=True, readSettings=True)
g = bridge.globals()
print('g: ' + repr(g))
print('bridge.isOpen: ' + str(bridge.isOpen()))
c = bridge.openLeoFile(sys.argv[1])
print('bridge.openLeoFile({0}) returned {1}'.format(sys.argv[1], c))
print(c.p)
if __name__ == "__main__":
main() And send here the output. |
Thanks @vitalije, this is the output of the new script:
As commented earlier, in order to have access to leo modules I had to set my
So I think that this is not the cause of the problem here... But don't know how to go further, so all the help is really welcome! |
FYI, I have also tried to run the script in a fresh new Python 3.5 conda enviroment, but with similar results:
|
@xgid, now we are getting somewhere. It appears that the Leo version that your script uses for launching bridge is in C:\dev\leo-5.4. I assume it is Leo5.4 not the latest git version. Check that you are not using old version for leo bridge, while newest version for normal use of Leo application. To check what is your Leo-git installation you may execute following script in Leo: g.es(g.os_path_dirname(g.app.leoDir)) It should print in Log pane path to your Leo git installation that contains latest version. Then set PYTHONPATH to that path and try your script again. Vitalije |
Thanks @vitalije. I'm sorry for the confusion, but despite the name the Leo version at Currently I only have the latest git version available anywhere in my system, so there's no possibility to be running an older version. How I wish that the cause of my problem was just that simple! What a shame! 😞 |
Ok. try to execute following command in
And post here the output. |
|
This is very strange! On my linux when I execute your leoBridgeOpen.py script, I have standard Leo signon message:
Maybe @edreamleo will have some idea what is going on. |
@edreamleo, please have look at this discussion with @xgid . His output is missing usual Leo signon message, and leoBridge.controller returns None. What can prevent printing usual signon message? It seems that the problem happens before printing signon. |
Thanks @vitalije. At least I got some time to debug the code and I've finally found at least 3 bugs and have been able to fix 2 of them so my script is now working. I'll try to explain the bugs as clearly as possible: The problem was in the call to if not self.getLeoID(): return This call was returning This method happens to try get LeoID by calling three different functions:
The first one tries to see if The second one looks for a
But it is the case that I have the file in none of them! My I think that this is the first bug. To fix it, I have just added for theDir in (g.app.homeDir, g.app.homeLeoDir, g.app.globalConfigDir, g.app.loadDir): But that did not fully fix the problem, because there's still another bug in that function: a And finally, the third function As a final reflection about all this "experience": I think that it should be easier to debug problems like this one without the need of a debugger. It would be REALLY useful to have a "verbose" flag which can be activated when running Leo that could make Leo show detailed traces of the code being run. The But I don't have enough expertise in Python to say if this is an easy matter... I guess it is not. Thanks again for all your support, @vitalije. |
For the record, my original script is now showing this other (expected) output:
|
…getIDFromEnv as suggested by XGiD from github. See #534 discussion. Leo build: 20170803065322
@xgid, I am glad that you worked it out. Thanks to your comments and suggestions I have made some improvements in leoBridge. First of all instead of returning None silently, when unable to find LeoID, now bridge will throw ValueError complaining that it wasn't able to set LeoID. |
On Wed, Aug 2, 2017 at 4:04 PM, XGiD ***@***.***> wrote:
Thanks @vitalije <https://github.com/vitalije>. At least I got some time
to debug the code and I've finally found at least 3 bugs and have been able
to fix 2 of them so my script is now working.
Thanks for this report. I see that Vitalije has already made some of the
changes I was planning to make. However, it does not seem that he has
pushed these yet.
My .leoID.txt file is located in the .leo folder under my user home
directory, so the function was not finding it
.
Strange. My .leoID.txt file is in the ~/.leo folder. I'll investigate
further.
a return is missing after line 283 to get out of the loop once g.app.leoID
has been set. Otherwise, it's value is set back to None (at line 285)
when checking the remaining paths.
Oops.
And finally, the third function getIDFromEnv is just looking at the
environment var USER which happens to be empty in windows. The
environment var used in Windows for that purpose is USERNAME, so I think
this is the third bug.
Oops again.
I think that it should be easier to debug problems like this one without
the need of a debugger. It would be REALLY useful to have a "verbose" flag
which can be activated when running Leo that could make Leo show detailed
traces of the code being run.
That's what --debug does. But what should it trace?
Imo, using g.trace or g.pdb is simple and good enough.
Imo, there is a more serious problem. app.setLeoID is almost identical to
bridge.getLeoId. This kind of code duplication is very ugly. I think it is
time to remove it. This may require that the code migrate into
leoGlobals.py, due to constraints on imports in the bridge.
I'll attempt to do this today.
The verbose argument in the call to leoBridge.controller() was not
showing any trace at all. I find it too much complicated to have to set trace
= True in every relevant function I find, run the code again, find
another trace to be activated ... and so on.
There is no good solution to this problem. --verbose could have printed
useful information to you, but such traces very quickly become annoying if
they aren't relevant.
In this case, it would indeed be useful to have one or more tracing
switches in bridge.getLeoId/app.setLeoID.
But I don't have enough expertise in Python to say if this is an easy
matter... I guess it is not.
It's not a Python problem. It's a question of the signal/noise ratio of
the traces.
Leo still has the g.SherlockTracer class. Feel free to use this to trace
various methods. I never use this pattern any more, but it was designed (in
the C world) precisely to zero in on relevant code.
Edward
|
On Thu, Aug 3, 2017 at 10:51 AM, Edward K. Ream <edreamleo@gmail.com> wrote:
I see that Vitalije has already made some of the changes I was planning to
make. However, it does not seem that he has pushed these yet.
My mistake. 8ad6a34 contains his changes. Thanks, Vitalije.
I plan to unify the app.setLeoID/bridge.getLeoId today. Hopefully I won't
utterly break the bridge ;-)
Edward
|
I plan to unify the app.setLeoID/bridge.getLeoId today.
This was easier than expected. The bridge code just calls:
g.app.setLeoID(useDialog=False, verbose=True)
The new useDialog keyword arg prevents Leo from attempting to use a dialog from the bridge. Only minor changes were needed to g.app.setLeoID.
Hopefully I won't utterly break the bridge ;-)
When run externally, "@test leoBridge init logic" test passes, after a minor tweak in the test code in leoImport.py. It fails, as expected, when leoID.txt does not exist. As always, this test is skipped when running tests locally.
|
Thanks @vitalije and @edreamleo for your commits to fix this so fast! Now it's working perfectly, so I'm gonna try some scripts to see how far I can get. |
Regarding this comment: Would it be possible to change that test so the code is run using a separate process (by means of the |
On Fri, Aug 4, 2017 at 6:35 PM, XGiD ***@***.***> wrote:
When run externally, ***@***.*** <https://github.com/test> leoBridge init
logic" test passes, after a minor tweak in the test code in leoImport.py.
It fails, as expected, when leoID.txt does not exist. As always, this test
is skipped when running tests locally.
Regarding this comment: Would it be possible to change that test so the
code is run using a separate process (by means of the
BackgroundProcessManager or using Popen directly, I don't know) and
inspecting the expected output? This way it would not need to be skipped
when run locally.
I'll look into this.
Edward
|
On Sat, Aug 5, 2017 at 5:46 AM, Edward K. Ream ***@***.***> wrote:
On Fri, Aug 4, 2017 at 6:35 PM, XGiD ***@***.***> wrote:
> When run externally, ***@***.*** <https://github.com/test> leoBridge init
> logic" test passes, after a minor tweak in the test code in leoImport.py.
> It fails, as expected, when leoID.txt does not exist. As always, this test
> is skipped when running tests locally.
>
> Regarding this comment: Would it be possible to change that test so the
> code is run using a separate process (by means of the
> BackgroundProcessManager or using Popen directly, I don't know) and
> inspecting the expected output? This way it would not need to be skipped
> when run locally.
>
I'll look into this.
Done at 319e8f3 in master. Updated LeoPyRef.leo so that it defines
leo/test/leo-bridge-test.py.
It used to be defined in test.leo.
Edward
|
Creating a leoBridge commander works, but using the commander to open a file always returns None. This happens with both Python 2 and Python 3.
This fits the well established pattern of completely breaking leoBridge every few months.
Test Version
Test Program leoBridgeOpenFails.py
Command Line
The text was updated successfully, but these errors were encountered: