Build A Stand-Alone Executable Elasticsearch Application Using Python
Introduction
This article will explain how to build a stand-alone Elasticsearch query application using Python.
The original Python code used for the app can be found in this ObjectRocket article explaining how to query Elasticsearch documents in a terminal window.
Prerequisites
1 | curl -GET "localhost:9200" -v |
Building an executable Python script with PyInstaller
Installing PyInstaller and building a Python application on Windows
It’s recommended that you use or switch to Python 3 instead of Python 2.7 since Python 2 is now deprecated and scheduled to lose support by 2020.
Type cmd
in the Windows Search bar, or type run
and then type cmd
in the modal window to open a new instance of Command Prompt to get started.
Install the PyInstaller package for Python 3 on Windows
Depending on your installations of Python you’ll need to use the pip3
or pip
command to install PyInstaller for Python 3. Type python --version
into a Command Prompt terminal. You should see a response that tells says Python 3.x.
If the response says you have version 2.7 installed, or if it raises an error, then try the following command instead:
1 | python3 --version |
If Python 3 used the python
alias (without the 3
), then use the pip
command to install PyInstaller:
1 | python -m pip install --user pyinstaller |
NOTE: Use the --user
option if Windows raises a permissions error.
Otherwise use pip3
to installed the package:
1 | pip3 install --user pyinstaller |
Here’s the command to upgrade your current version of PyInstaller:
1 | python -m pip install --upgrade --user pyinstaller |
PyInstaller command-not-found error in Windows
Type python -m PyInstaller
, pyinstaller
, or PyInstaller
into your Command Prompt window and press return. If none of these commands work, then it probably means that the pyinstaller.exe
executable file is not set in your system’s environmental variables path.
Windows doesn’t know the path to the PyInstaller executable file
Use the echo %PATH
in your command line to have it return a list of all the paths for your environmental variables.
Type environment
into the Windows Search bar, or just open the System Properties window in your Control Panel. Make sure to click on the Advanced tab in System Properties, and then click the Environment Variables button:
Add the path for the ‘pyinstaller.exe’ to your Windows environment variables
Open a instance of File Explorer and navigate to C:\Program Files\Python37\Scripts
or C:\Users\USER_NAME\AppData\Roaming\Python\Python37\Scripts
and look for the executable. Once you find the file make sure to get its full path.
Click the New.. button in your Environmental Variables to add the system path for the pyinstaller.exe
file. Make sure to type PyInstaller
in the Variable name input field, and the path to the .exe
file in the Variable value field.
Verify that the PyInstaller command for Python 3 is now working
Close all your instances of Command Prompt, and re-open it. Type PyInstaller
or python PyInstaller
into the window’s prompt, and it should now return a response from the executable.
Build a Windows executable using the Pyinstaller package for Python
You should now be able to build an executable from a Python script using PyInstaller using the following command:
1 | python -m PyInstaller script_name.py |
NOTE: Make sure to first change (cd
) into the directory containing the Python script before running the PyInstaller
command.
python -m pip install –upgrade –user pip python -m pip install –upgrade –user pyinstaller
pip -v install –user elasticsearch
PyInstaller C:UsersObjectRocketAppDataRoamingPythonPython37Scriptspyinstaller.exe
Python
echo %PATH%
C:UsersObjectRocketAppDataRoamingPythonPython37Scripts
python -m PyInstaller
pyinstaller –version
Installing the PyInstaller Package on Ubuntu distros of Linux
pip3 install pyinstaller
sudo apt-get install libc-bin sudo apt-get install binutils
pyinstaller
pyinstaller: error: the following arguments are required: scriptname
pyinstaller cli.py python3 -O -m PyInstaller elastic_query.py
cd dist/elastic_query/
./elastic_query test
sudo rm -rf build/; sudo rm -rf dist/; sudo rm -rf pycache/; sudo rm elastic_query.spec
Change into the PyInstaller’s ‘dist’ directory
Execute the ‘elastic_query’ file created by PyInstaller with a query
pass a query to its parameters
Elasticsearch cluster response returned from the PyInstaller application’s API request
1 | ./elastic_query some_index "str field" "ObjectRocket" |
Conclusion
We hope you enjoyed this tutorial on how to build a stand-alone Elasticsearch query application with Python. You can grab any or all of the code we used below.
Just the Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #!/usr/bin/env python3 #-*- coding: utf-8 -*- # use sys for system arguments passed to script import sys # import the Elasticsearch client library from elasticsearch import Elasticsearch # create a client instance of Elasticsearch client = Elasticsearch("http://localhost:9200") # The script name is the first arg [0], but the second arg [1] # can be used for the Elasticsearch index's name try: INDEX_NAME = sys.argv[1] except IndexError as err: print ("IndexError - Script needs the Elasticsearch index name:", err) sys.exit() def make_query(filter): index_exists = client.indices.exists(index=INDEX_NAME) # check if the index exists if index_exists == True: print ("INDEX_NAME:", INDEX_NAME, "exists.") print ("FILTER:", filter, "\n") try: # pass filter query to the client's search() method response = client.search(index=INDEX_NAME, body=filter) # print the query response` print ('response["hits"]:', len(response["hits"])) print ('response TYPE:', type(response)) # iterate the response hits print ("\nQueried %d Hits:" % response['hits']['total']['value']) for hit in response['hits']['hits']: print(hit["_source"]) except Exception as err: print ("search(index) ERROR", err) response = {"error": err} # return an empty dict if index doesn't exist else: response = {} return response def main(): # declare variable for system arguments list sys_args = sys.argv # remove Python script name from args list sys_args.pop(0) # quit the script if there are not exactly 3 arguments if len(sys_args) != 3: print ("Three arguments needed. You provided:", sys_args) print ("First argument is index, and next two are the field and query:", sys_args) sys.exit() else: # get the field name and query value from sys args field_name = sys_args[1] value = sys_args[2] # pass the field name and value args to filter dict filter = { 'query': { 'match': { field_name: value } } } # pass the filter dict to the make_query() function resp = make_query(filter) # have interpreter call the main() func if __name__ == "__main__": main() |
Pilot the ObjectRocket Platform Free!
Try Fully-Managed CockroachDB, Elasticsearch, MongoDB, PostgreSQL (Beta) or Redis.
Get Started