I have written a python script that connects to a remote Oracle database and inserts some data into its tables.
In the process I had to first import cx_Oracle package and install Oracle InstantClient on my local computer for the script to execute properly.
What I don't understand is why did I have to install InstantClient?
I tried to read through the docs but I believe I am missing some fundamental understanding of how databases work and communicate.
Why do I need all the external drivers, dlls, libraries for a python script to be able to communicate with a remote db? I believe this makes packaging and distribution of a python executable much harder.
Also what is InstantClient anyway?
Is it a driver? What is a driver? Is it simply a collection of "programs" that know how to communicate with Oracle databases? If so, why couldn't that be accomplished with a simple import of a python package?
This may sound like I did not do my own research beforehand, but I'm sorry, I tried, and like I said, I believe I am missing some underlying fundamental knowledge.
We have a collection of drivers that allow you to communicate with an Oracle Database. Most of these are 'wrappers' of a sort that piggyback on the Oracle Client. Compiled C binaries that use something we call 'Oracle Net' (not to be confused with .NET) to work with Oracle.
So our python, php, perl, odbc, etc drivers are small programs written such that they can be used to take advantage of the Oracle Client on your system. 
The Oracle Client is much more than a driver. It can include user interfaces such as SQL*Plus, SQL*Loader, etc. Or it can be JUST a set of drivers - it depends on which exact package you choose to download and install. And speaking of 'install' - if you grab the Instant Client, there's nothing to install. You just unzip it and update your environment path bits appropriately so the drivers can be loaded.
Explain the necessity of database drivers, libraries, dlls in a python application that interacts with a remote database?