Embedding a Python library in my own package
Question:
How can I ’embed’ a Python library in my own Python package?
Take the Requests library, for instance.
How could I integrate it into my own package, the objective being to allow me to run my application on different machines without actually installing Requests on every one, but having it in the same folder as my package?
Is this even possible?
Answers:
If it’s a pure python library (no compiled modules) you can simply place the library in a folder in your project and add that folder to your module search path. Here’s an example project:
|- application.py
|- lib
| `- ...
|- docs
| `- ...
`- vendor
|- requests
| |- __init__.py
| `- ...
`- other libraries...
The vendor
folder in this example contains all third party modules. The file application.py
would contain this:
import os
import sys
# Add vendor directory to module search path
parent_dir = os.path.abspath(os.path.dirname(__file__))
vendor_dir = os.path.join(parent_dir, 'vendor')
sys.path.append(vendor_dir)
# Now you can import any library located in the "vendor" folder!
import requests
Bonus fact
As noted by seeafish in the comments, you can install packages directly into the vendor directory:
pip install <pkg_name> -t /path/to/vendor_dir
If you only need to run your application may be pyinstaller packaging is a better option.
It will create a single bundle with everything that is needed, including Python, to avoid dependencies on the system you’re running in.
While not a direct answer to your question. You may want to look at setuptools
. By leveraging this package distribution mechanism you can describe your dependencies and when your package is “installed” all the dependent packages will be installed too. You would create a setup.py
file at the top of your package structure similar to:
from setuptools import setup, find_packages
setup(
name = 'MyPackage',
version = '1.0',
packages = find_packages(),
...
install_requires = ['requests'],
...
)
this would be installed by the user
python setup.py install
Requests would be automatically installed too.
All of the above answers are correct but the best solution is creating a standard package.
You can refer to this link:
https://packaging.python.org/tutorials/packaging-projects/
How can I ’embed’ a Python library in my own Python package?
Take the Requests library, for instance.
How could I integrate it into my own package, the objective being to allow me to run my application on different machines without actually installing Requests on every one, but having it in the same folder as my package?
Is this even possible?
If it’s a pure python library (no compiled modules) you can simply place the library in a folder in your project and add that folder to your module search path. Here’s an example project:
|- application.py |- lib | `- ... |- docs | `- ... `- vendor |- requests | |- __init__.py | `- ... `- other libraries...
The vendor
folder in this example contains all third party modules. The file application.py
would contain this:
import os
import sys
# Add vendor directory to module search path
parent_dir = os.path.abspath(os.path.dirname(__file__))
vendor_dir = os.path.join(parent_dir, 'vendor')
sys.path.append(vendor_dir)
# Now you can import any library located in the "vendor" folder!
import requests
Bonus fact
As noted by seeafish in the comments, you can install packages directly into the vendor directory:
pip install <pkg_name> -t /path/to/vendor_dir
If you only need to run your application may be pyinstaller packaging is a better option.
It will create a single bundle with everything that is needed, including Python, to avoid dependencies on the system you’re running in.
While not a direct answer to your question. You may want to look at setuptools
. By leveraging this package distribution mechanism you can describe your dependencies and when your package is “installed” all the dependent packages will be installed too. You would create a setup.py
file at the top of your package structure similar to:
from setuptools import setup, find_packages
setup(
name = 'MyPackage',
version = '1.0',
packages = find_packages(),
...
install_requires = ['requests'],
...
)
this would be installed by the user
python setup.py install
Requests would be automatically installed too.
All of the above answers are correct but the best solution is creating a standard package.
You can refer to this link:
https://packaging.python.org/tutorials/packaging-projects/