Jon, Thanks for digging into it. Reporting that Noah's script works for you in GnuCash 5.5 was very helpful because there's been only one change to the bindings since then: I removed a load call from the Session constructor to fix bug 799308. That wasn't exactly the right thing to do, but it's a surmountable problem: Load the session in the script.
Noah's other problem, that the lock file is left, is because `session` never goes out of scope before the script ends, preventing the destructor from being called. Use Python's RAII keyword `with…;` to ensure that `session` is destroyed. There's one other problem, ACCT_TYPE_STOCK isn't explicitly imported so it needs its package prefix. The following diff fixes all three problems: --- test.py~ 2024-10-26 16:15:09.000000000 -0700 +++ test.py 2024-10-26 16:30:06.000000000 -0700 @@ -2,14 +2,15 @@ from gnucash import (Session, Account, Transaction, Split, GncNumeric, SessionOpenMode, gnucash_core) uri="file:///Users/me/Downloads/gnucash_localSave.gnucash" -session = Session(book_uri=uri, -mode=gnucash_core.SessionOpenMode.SESSION_NORMAL_OPEN ) -book = session.book -table = book.get_table() -currency_code = 'USD' -currency = table.lookup('ISO4217', currency_code) -root_account = book.get_root_account() -for acc in root_account.get_descendants(): - print('checking a descendant...') - if acc.GetType() == ACCT_TYPE_STOCK: - print('found a stock') +with Session(book_uri=uri, + mode=gnucash_core.SessionOpenMode.SESSION_NORMAL_OPEN) as session: + session.load() + book = session.book + table = book.get_table() + currency_code = 'USD' + currency = table.lookup('ISO4217', currency_code) + root_account = book.get_root_account() + for acc in root_account.get_descendants(): + print('checking a descendant...') + if acc.GetType() == gnucash_core.ACCT_TYPE_STOCK: + print('found a stock') Note that I didn't change get_descendants() to get_children(). get_children() returns only the immediate children of the account, get_descendants() recursively calls get_children() to return all of the account's descendants. Since Noah is looking for a Stock account and it's rare that a stock account would be at the top level, get_descendants() is the right function. Now to revisit getting the Session constructor to load xml files since I obviously got that wrong. Regards, John Ralls > On Oct 26, 2024, at 10:21 AM, Jon Schewe <jpsch...@mtu.net> wrote: > > Noah and I traded a couple of messages directly about this off-list. I > tried reading Noah's file and and it worked just fine, get_children > showed the accounts; on their computer it did not. I was using the > python bindings for GNuCash 5.5 that are shipped with Ubuntu 24.04. I > don't know how to get the version of the gnucash bindings from inside > python, so I'm not sure what version Noah was using, however they are > on mac OS. > Does anyone have suggestions why I would see the list of accounts and > Noah would not? > > Example output from my system. Noah gets an empty list when calling > get_children(). > >> python3 > Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] on linux > Type "help", "copyright", "credits" or "license" for more information. >>>> import gnucash >>>> filename = 'gnucash_localSave.gnucash' >>>> session = gnucash.Session(filename, > gnucash.SessionOpenMode.SESSION_NORMAL_OPEN) >>>> root_account = session.book.get_root_account() >>>> root_account.get_children() > [<gnucash.gnucash_core.Account object at 0x70e7709b6330>, > <gnucash.gnucash_core.Account object at 0x70e7709b7d10>, > <gnucash.gnucash_core.Account object at 0x70e7709b7e90>] >>>> session.end() >>>> quit() > > Jon > > On Fri, 2024-10-25 at 19:59 -0500, Jon Schewe wrote: >> You want "get_children" instead of "get_descendents". >> >> On Thu, 2024-10-24 at 21:51 -0700, Noerr via gnucash-user wrote: >>> Hi, >>> >>> I've been trying to get started with the GnuCash API Python >>> bindings >>> after just using the main desktop app for the last 12 years. >>> I built GnuCash app (Build ID: 5.9+(2024-09-28) along with API and >>> Python >>> bindings enabled for my system (MacOS 15.0 , M1 Arm) >>> >>> My problem is that I haven't been able to interact with my GnuCash >>> data in >>> a useful way yet. Namely, I can't seem to access any existing >>> accounts, >>> and thus no transactions either. Nor any entries in the price >>> database. >>> >>> First I used the desktop app to save-as a copy of my GnuCash data >>> in >>> the >>> XML format. >>> Next I use python and commands generally like the following. I do >>> not see >>> any output that is expected when iterating over the descendants of >>> root_account. ( I never see the text output, 'checking a >>> descendant...' ) >>> >>> >>> from gnucash import (Session, Account, Transaction, Split, >>> GncNumeric, >>> SessionOpenMode, gnucash_core) >>> uri="file:///Users/me/Downloads/gnucash_localSave.gnucash" >>> session = Session(book_uri=uri, >>> mode=gnucash_core.SessionOpenMode.SESSION_NORMAL_OPEN ) >>> book = session.book >>> table = book.get_table() >>> currency_code = 'USD' >>> currency = table.lookup('ISO4217', currency_code) >>> root_account = book.get_root_account() >>> for acc in root_account.get_descendants(): >>> print('checking a descendant...') >>> if acc.GetType() == ACCT_TYPE_STOCK: >>> print('found a stock') >>> >>> >>> **So why is root_account.get_descendants() returning an empty >>> container?** >>> >>> The Bindings/API aren't completely dead though. With the same >>> session and >>> book open above, I was playing around with some of the ideas >>> Eberhard >>> demonstrated in this thread [ >>> https://lists.gnucash.org/pipermail/gnucash-user/2024-September/113402.html >>> ] >>> and I called >>>>>> create_accounts(session, book, root_acct) >>>>>> quit() >>> >>> To my suprise, when I used the desktop app to open >>> gnucash_localSave.gnucash, my real accounts and transactions are >>> gone, but >>> I have three accounts: Expenses, Opening Balance, and Savings in >>> CAD >>> currency, and with the specified opening balances. >>> So the Bindings and API worked to create stuff. >>> >>> As an aside, the file did flag as locked upon open in the desktop >>> app. I >>> suspect there's a missing unlock somewhere in Python Bindings / >>> destructor >>> code. >>> >>> Cheers, >>> >>> Noah >>> _______________________________________________ >>> gnucash-user mailing list >>> gnucash-user@gnucash.org >>> To update your subscription preferences or to unsubscribe: >>> https://lists.gnucash.org/mailman/listinfo/gnucash-user >>> ----- >>> Please remember to CC this list on all your replies. >>> You can do this by using Reply-To-List or Reply-All. >> >> _______________________________________________ >> gnucash-user mailing list >> gnucash-user@gnucash.org >> To update your subscription preferences or to unsubscribe: >> https://lists.gnucash.org/mailman/listinfo/gnucash-user >> ----- >> Please remember to CC this list on all your replies. >> You can do this by using Reply-To-List or Reply-All. > > _______________________________________________ > gnucash-user mailing list > gnucash-user@gnucash.org > To update your subscription preferences or to unsubscribe: > https://lists.gnucash.org/mailman/listinfo/gnucash-user > ----- > Please remember to CC this list on all your replies. > You can do this by using Reply-To-List or Reply-All. _______________________________________________ gnucash-user mailing list gnucash-user@gnucash.org To update your subscription preferences or to unsubscribe: https://lists.gnucash.org/mailman/listinfo/gnucash-user ----- Please remember to CC this list on all your replies. You can do this by using Reply-To-List or Reply-All.