How to install packages offline?

389,216

Solution 1

If the package is on PYPI, download it and its dependencies to some local directory. E.g.

$ mkdir /pypi && cd /pypi
$ ls -la
  -rw-r--r--   1 pavel  staff   237954 Apr 19 11:31 Flask-WTF-0.6.tar.gz
  -rw-r--r--   1 pavel  staff   389741 Feb 22 17:10 Jinja2-2.6.tar.gz
  -rw-r--r--   1 pavel  staff    70305 Apr 11 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r--r--   1 pavel  staff  2597214 Apr 10 18:26 SQLAlchemy-0.7.6.tar.gz
  -rw-r--r--   1 pavel  staff  1108056 Feb 22 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r--r--   1 pavel  staff   488207 Apr 10 18:26 boto-2.3.0.tar.gz
  -rw-r--r--   1 pavel  staff   490192 Apr 16 12:00 flask-0.9-dev-2a6c80a.tar.gz

Some packages may have to be archived into similar looking tarballs by hand. I do it a lot when I want a more recent (less stable) version of something. Some packages aren't on PYPI, so same applies to them.

Suppose you have a properly formed Python application in ~/src/myapp. ~/src/myapp/setup.py will have install_requires list that mentions one or more things that you have in your /pypi directory. Like so:

  install_requires=[
    'boto',
    'Flask',
    'Werkzeug',
    # and so on

If you want to be able to run your app with all the necessary dependencies while still hacking on it, you'll do something like this:

$ cd ~/src/myapp
$ python setup.py develop --always-unzip --allow-hosts=None --find-links=/pypi

This way your app will be executed straight from your source directory. You can hack on things, and then rerun the app without rebuilding anything.

If you want to install your app and its dependencies into the current python environment, you'll do something like this:

$ cd ~/src/myapp
$ easy_install --always-unzip --allow-hosts=None --find-links=/pypi .

In both cases, the build will fail if one or more dependencies aren't present in /pypi directory. It won't attempt to promiscuously install missing things from Internet.

I highly recommend to invoke setup.py develop ... and easy_install ... within an active virtual environment to avoid contaminating your global Python environment. It is (virtualenv that is) pretty much the way to go. Never install anything into global Python environment.

If the machine that you've built your app has same architecture as the machine on which you want to deploy it, you can simply tarball the entire virtual environment directory into which you easy_install-ed everything. Just before tarballing though, you must make the virtual environment directory relocatable (see --relocatable option). NOTE: the destination machine needs to have the same version of Python installed, and also any C-based dependencies your app may have must be preinstalled there too (e.g. say if you depend on PIL, then libpng, libjpeg, etc must be preinstalled).

Solution 2

On the system that has access to internet

The pip download command lets you download packages without installing them:

pip download -r requirements.txt

(In previous versions of pip, this was spelled pip install --download -r requirements.txt.)

On the system that has no access to internet

Then you can use

pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt

to install those downloaded modules, without accessing the network.

Solution 3

If you want install python libs and their dependencies offline, finish following these steps on a machine with the same os, network connected, and python installed:

1) Create a requirements.txt file with similar content (Note - these are the libraries you wish to download):

Flask==0.12
requests>=2.7.0
scikit-learn==0.19.1
numpy==1.14.3
pandas==0.22.0

One option for creating the requirements file is to use pip freeze > requirements.txt. This will list all libraries in your environment. Then you can go in to requirements.txt and remove un-needed ones.

2) Execute command mkdir wheelhouse && pip download -r requirements.txt -d wheelhouse to download libs and their dependencies to directory wheelhouse

3) Copy requirements.txt into wheelhouse directory

4) Archive wheelhouse into wheelhouse.tar.gz with tar -zcf wheelhouse.tar.gz wheelhouse

Then upload wheelhouse.tar.gz to your target machine:

1) Execute tar -zxf wheelhouse.tar.gz to extract the files

2) Execute pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouse to install the libs and their dependencies

Solution 4

Let me go through the process step by step:

  1. On a computer connected to the internet, create a folder.
   $ mkdir packages
   $ cd packages
  1. open up a command prompt or shell and execute the following command:

    Suppose the package you want is tensorflow

    $ pip download tensorflow

  2. Now, on the target computer, copy the packages folder and apply the following command

  $ cd packages
  $ pip install 'tensorflow-xyz.whl' --no-index --find-links '.'

Note that the tensorflow-xyz.whl must be replaced by the original name of the required package.

Solution 5

offline python. for doing this I use virtualenv (isolated Python environment)

1) install virtualenv online with pip:

pip install virtualenv --user

or offline with whl: go to this link , download last version (.whl or tar.gz) and install that with this command:

pip install virtualenv-15.1.0-py2.py3-none-any.whl --user

by using --user you don't need to use sudo pip….

2) use virtualenv

on online machine select a directory with terminal cd and run this code:

python -m virtualenv myenv
cd myenv
source bin/activate
pip install Flask

after installing all the packages, you have to generate a requirements.txt so while your virtualenv is active, write

pip freeze > requirements.txt

open a new terminal and create another env like myenv2.

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
ls

now you can go to your offline folder where your requirements.txt and tranferred_packages folder are in there. download the packages with following code and put all of them to tranferred_packages folder.

pip download -r requirements.txt

take your offline folder to offline computer and then

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
cd offline
pip install --no-index --find-links="./tranferred_packages" -r requirements.txt

what is in the folder offline [requirements.txt , tranferred_packages {Flask-0.10.1.tar.gz, ...}]

check list of your package

pip list

note: as we are in 2017 it is better to use python 3. you can create python 3 virtualenv with this command.

virtualenv -p python3 envname
Share:
389,216

Related videos on Youtube

Chris Drantz
Author by

Chris Drantz

Updated on July 08, 2022

Comments

  • Chris Drantz
    Chris Drantz almost 2 years

    What's the best way to download a python package and it's dependencies from pypi for offline installation on another machine? Is there any easy way to do this with pip or easy_install? I'm trying to install the requests library on a FreeBSD box that is not connected to the internet.

  • Chris Drantz
    Chris Drantz almost 12 years
    What about all the dependencies? What's the best way to resolve them? Do I need to install the dependencies manually as well?
  • dav1d
    dav1d almost 12 years
    Yes, that's unfortunatly the only way I know.
  • vikki
    vikki almost 11 years
    problem with this is that the dependencies might have other dependencies and those won't be downloaded.
  • vikki
    vikki almost 11 years
    Snake basket (built on top of pip) will download the dependencies' dependencies as well.
  • Carl Meyer
    Carl Meyer almost 11 years
    @vikki Not true, "pip install --download" also downloads dependencies, so the above commands will work correctly even if your requirements have additional dependencies. Snake basket may do other useful things (never used it), but it's definitely not needed for that reason.
  • vikki
    vikki almost 11 years
    pip install --download -r requirements.txt only downloads the dependencies listed in requirements.txt, if those dependencies have other requirements e.g in setup.py, pip won't fetch those, sb adds that feature. e.g if a project requires sphinx pip -d will only fetch sphinx but not jinja, pygments and docutils (which are needed by sphinx). These will only be fetched once you run setup.py, but since this is supposed to be for offline use you won't have a working connection at the time you run setup.py and the installation will fail citing unmet dependencies as the issue.
  • Carl Meyer
    Carl Meyer almost 11 years
    @vikki I understand what you are saying, but I am telling you that it is not true :-) You should actually go try it before you post the same assertion again. I just put "pytest" in a requirements.txt, ran "pip install --download . -r requirements.txt", and it downloaded sdists for both pytest and its setup.py dependency, "py".
  • vikki
    vikki almost 11 years
    Okay I'll try again. I could have sworn I tried it today with sphinx, and pip on its own didn't pick up sphinx's deps, only after adding sb did it download them. I'll investigate further.
  • vikki
    vikki almost 11 years
    After reading this I now understand that snakebasket only forces pip to inspect each download's requirements.txt and download whatever is listed. Some projects will list their dependencies in requirements.txt and the list will vary from that which is in setup.py. django-oscar is an example.
  • rickfoosusa
    rickfoosusa about 9 years
    I think this is the more correct/simple answer. It takes care of the requirements without an intervening step.
  • jacderida
    jacderida about 9 years
    Like @vikki, for me this also didn't download the entire dependency graph. However, I still appreciate the answer, as it was only one package that was missing, and I just explicitly added it to requirements.txt.
  • romor
    romor almost 9 years
    Instead of --allow-hosts=None you could use the switch --no-index
  • A. Binzxxxxxx
    A. Binzxxxxxx over 8 years
    I think it should be: --find-links file:/path/to/some/dir/ and you should download and install with the same version of pip - otherwise it might fail
  • psr
    psr over 7 years
    Can you please elaborate how to create a properly formed Python application?
  • Pavel Repin
    Pavel Repin over 7 years
    @PrabhjotRai please refer to packaging.python.org/distributing
  • Amir Hossein Baghernezad
    Amir Hossein Baghernezad almost 7 years
    pip download -r requirements.txt this is true.
  • Juuso Ohtonen
    Juuso Ohtonen over 6 years
    I had issues with bundling up on machine with Python 3.6 and extracting on another with Python 3.5: "<package>.whl is not a supported wheel on this platform". The source and destination versions might be required to match with some packages.
  • Hannu
    Hannu over 6 years
    There appears to be steps missing or "obfuscated" here, I would expect to see a 'deactivate' and then 'pip freeze'... cd offline and ./tranferred_packages appears from nowhere - clearly this needs a cleanup?
  • cyera
    cyera over 6 years
    maybe, but you should consider 'I wanted a brief post' , 'that process was complex and I couldn't write every step (that only possible in YouTube)'.
  • iled
    iled over 5 years
    Note that pip download <package> downloads dependencies as well.
  • webofmars
    webofmars over 5 years
    This is the best answer imho. Helped a lot
  • kumarharsh
    kumarharsh about 5 years
    This is the clearest answer with proper steps for a beginner. Thanks
  • Leonard AB
    Leonard AB over 4 years
    i added --no-deps to the command, otherwise it will try to find some dependencies online (which was not possible)
  • Zim
    Zim over 4 years
    This would be the best answer if it said anything at all on how to setup the tranferred_packages folder. Without crucial steps, -1
  • peluzza
    peluzza about 4 years
    This is the most pythonic way i've seen so far. Thanks!
  • DennisLi
    DennisLi almost 4 years
    but following your instruction, when I pip install in the end, it says: ERROR: could not find a version that satisfies the requirement ..`
  • chaokunyang
    chaokunyang almost 4 years
    @DennisLi what's your python and pip version?
  • DennisLi
    DennisLi almost 4 years
    I figured this out, that is because pip can't find the specific version of the pandas package in my requirements.txt, as I used pip3 to install the pandas 0.2
  • Han Whiteking
    Han Whiteking almost 4 years
    same happened to me. with pip3 i received same error message mentioned. maybe it only works with python2 only.
  • Hossein
    Hossein almost 4 years
    @chaokunyang Thanks a lot. Could you please also give me a hint how I can embed this process into the setup.py so when installing my own package, it goes and installs all the deps as well ?
  • Admin
    Admin over 3 years
    This is the simple and brief answer I needed.
  • shuckc
    shuckc about 3 years
    One problem with this workflow is different architectures. If you run pip download ... on a mac, you will have *-macosx*.whl files that are unusable on e.g. linux
  • user238607
    user238607 almost 3 years
    One more thing that helped when installing the packages in virtual environment is adding this command just after creating the environment. python3 -m pip install --upgrade pip . Not doing this led to spurious errors.
  • stackprotector
    stackprotector over 2 years
    Can you somehow generate the requirements.txt for a certain Python version? Let's say, I have Python 3.8.2 (not the newest version). I want the package numpy. How do I know which version I need to download for my Python version? Do the Python versions on the online and offline computer have to be the same?