### How to install a custom GeoApp

· 1 · 251

#### Tom Cvjetkovic

• Posts: 1
##### How to install a custom GeoApp
« on: October 21, 2022, 05:25:52 PM »
Dear GeoDict-Team,

I have developed a custom GeoApp which incorporates a special workflow. Now I would like to provide an easy way to install it.

The App itself is available as a Python package on a private package registry, so usually I would use the following command to install it
(here for the private Gitlab package registry)

Code: [Select]
pip install <geoapp> --extra-index-url https://__token__:<your_personal_token>@gitlab.com/api/v4/projects/xxxx/packages/pypi/simple
unfortunately, this doesn't work in GeoDict. Although there is an option to install an additional Python package (via Macro-> Execute Macro/Script -> Add Python Package), using the addional option for pip doesn't work.

My current workaround for Installing the GeoApp is a separate install script. One can simply run this install script in GeoDict to install and update the GeoApp.

First, we have a function which provides the path to the Python executable (we need this because sys.executable points to the global python executable)

Code: [Select]
def get_python_executable():    if sys.platform.startswith("linux"):        py_executable = Path(gd.getInstallationFolder()) / "python36"    elif sys.platform.startswith("win"):        py_executable = Path(gd.getInstallationFolder()) / "python36.exe"    return py_executable
Additionally, we need a helper function to run the install command later

Code: [Select]
def run_cmd(cmd, verbose=True):    with Popen(cmd, stdout=PIPE, stderr=STDOUT, bufsize=1, universal_newlines=True) as p:        for line in p.stdout:            if verbose:                print(line, end='')        p.poll()    return p.returncode
Then we can run the pip command to install and upgrade using a private package index-url. We also need to define the target to install the GeoApp and it's dependencies in the GeoDict user folder.

Code: [Select]
executable = get_python_executable().as_posix()target = (Path(gd.getSettingsFolder()) / "Python").as_posix()index_url = https://__token__:<your_personal_token>@gitlab.com/api/v4/projects/xxxx/packages/pypi/simple package_name = "my_geoapp"cmd = [executable, "-m", "pip", "install", "--upgrade", "--target", target, package_name, "--extra-index-url", index_url]
After that we need to restart GeoDict and call a setup function which copies the GeoApp-Macros into the GeoDict user folder. For Linux, this would be ~/.geodict22/GeoApp/MyGeoApp.
The GeoApp Macros just contain the code for the user interface. The actual business logic is inside the python package.

As you can see, this is a rather complicated way to install a GeoApp, I am sure there must be a better way, what do you think :-)

Best regards, Tom