Using Artifactory 5.x ?
JFrog Artifactory 5.x User Guide

Have a question? Want to report an issue? Contact JFrog support

Skip to end of metadata
Go to start of metadata


Artifactory fully supports PyPI repositories on top of Artifactory's existing support for advanced artifact management.

Artifactory support for PyPI provides:

  1. The ability to provision PyPI packages from Artifactory to the pip command line tool from all repository types.
  2. Calculation of Metadata for PyPI packages hosted in Artifactory's local repositories.
  3. Access to remote PyPI repositories (such as through Remote Repositories which provide proxy and caching functionality.
  4. The ability to access multiple PyPI repositories from a single URL by aggregating them under a Virtual Repository.
  5. Compatibility with the setuptools and its predecessor distutils libraries for uploading PyPI packages.


Local Repositories

To create a new PyPI local repository, in the New Local Repository screen, set the Package Type to PyPI.

New local PyPI repository

Page Contents

Remote Repositories

A Remote Repository defined in Artifactory serves as a caching proxy for a registry managed at a remote URL such as

Artifacts (such as .whl files) requested from a remote repository are cached on demand. You can remove downloaded artifacts from the remote repository cache, however you can not manually deploy artifacts to a remote PyPI repository. 

To create a repository to proxy a remote PyPI repository follow the steps below:

  1. In the Admin module under Repositories | Remote, select "New" 
  2. Set the Package Type to PyPI, enter the Repository Key value, and specify the URL to the remote repository in the URL field as displayed below:

    PyPI remote repository URL

    You should not include "/pypi" or "/simple" in the the PyPI remote repository URL. These suffixes are added by Artifactory when accessing the remote repository.

    If you use a custom PyPI remote repository, you need to make sure it has a simple index (directory listing style) accessible by <URL>/simple.

  3. Click "Save & Finish"

    Remote Artifactory

    If the remote repository is also managed by an Artifactory server, then you need to point to its PyPI API URL, for example http://my.remote.artifactory/artifactory/api/pypi/python-project

Virtual Repositories

A Virtual Repository defined in Artifactory aggregates packages from both local and remote repositories.
This allows you to access both locally hosted PyPI  packages and remote proxied PyPI repositories from a single URL defined for the virtual repository.
To define a virtual PyPI repository, create virtual repository, set its Package Type to be PyPI, select the underlying local and remote PyPI repositories to include in the Basic settings tab, click "Save & Finish".

Resolving from Artifactory Using PIP

To install the pip command line tool refer to  pip documentation pages. We recommend using  virtualenv to separate your environment when installing PIP.

To display code snippets you can use to configure pip and to use your PyPI repository, select the repository and then click Set Me Up.

Specifying the Repository on the Command Line

Index URL

When accessing a PyPI repository through Artifactory, the repository URL must be prefixed with api/pypi in the path. This applies to all pip commands and distutils URLs including pip install.

When using pip to resolve PyPI packages it must point to <Artifactory URL>/api/pypi/<repository key>/simple .

For example, if you are using Artifactory standalone or as a local service, you would access your PyPI repositories using the following URL:

http://localhost:8081/artifactory/api/pypi/<repository key>/simple

Or, if you are using Artifactory SaaS, the URL would be:

https://<server name><server name>/api/pypi/<repository key>/simple

Once pip is installed, it can be used to specify the URL of the repository from which to resolve:

Installing with full repository URL
$ pip install frog-bar -i http://localhost:8080/artifactory/api/pypi/pypi-local/simple

Using Credentials

Due to it's design, pip does not support reading credentials from a file. Credentials can be supplied as part of the URL, for example http://<username>:<password>@localhost:8080/artifactory/api/pypi/pypi-local/simpleThe password can be omitted (with the preceding colon), and in this case, the user will be prompted to enter credentials interactively.

Using a Configuration File

Aliases for different repositories can be specified through a pip configuration file, ~/.pip/pip.conf . The file contains configuration parameters per repository, for example:

index-url = http://user:password@localhost:8080/artifactory/api/pypi/pypi-virtual/simple

For more information, please refer to  PIP User Guide.

Using a Requirements File

A requirements file contains a list of packages to install. Usually these are dependencies for the current package. It can be created manually or using the pip freeze command. The index URL can be specified in the first line of the file, For example:

--index-url http://localhost:8080/artifactory/api/pypi/pypi-local/simple


Publishing to Artifactory

Using distutils or setuptools

setuptools vs. distutils and python versions

Artifactory is agnostic to whether you use setuptools or distutils, and also to the version or implementation of Python your project uses.

The following instruction were written for Python 2.7 and setuptools in mind. Using different version of Python, or different tools such zest, distutils and others may require minor modification to the instructions below.

Uploading to Artifactory using a script is supported in a similar way to uploading to PyPI. First, you need to add Artifactory as an index server for your user.

For instructions on using setuptools to package Python projects and create a script, please refer to the  setuptools documentation and this tutorial project.

Create the $HOME/.pypirc File

To upload to Artifactory, an entry for each repository needs to be made in $HOME/.pypirc as follows:

index-servers =

username: mrBagthrope
password: notToBeSeen

repository: http://localhost:8080/artifactory/api/pypi/pypi-local
username: admin
password: password

Notice that the URL does not end with /simple.

The HOME environment variable

setuptools requires that the .pypirc file be found under $HOME/.pypirc, using the HOME environment variable.

On unix-like systems this is usually set by your system to /home/yourusername/ but in certain environments such as build servers you will have to set it manually.

On Windows it must be set manually.


After creating a .pypirc file and a script at the root of your project, you can upload your egg (tar.gz) packages as follows:

~/python_project $ python sdist upload -r local

If you are using wheel (whl) you can upload your packaged as follows:

~/python_project $ python bdist_wheel upload -r local

Or if you wish to use both egg (tar.gz) and wheel (whl), you can upload them as follows:

~/python_project $ python sdist bdist_wheel upload -r local

Where local is the name of the section in your .pypirc file that points to your Artifactory PyPI repository.

Default upload

By default, both setuptools and distutils will upload to if no repository is specified.

The 'register' command should be omitted

When uploading directly to, the documentation states that your package must first be registered by calling python register.

When uploading to Artifactory this is neither required nor supported and should be omitted.

Publishing Manually Using the Web UI or REST

PyPI packages can also be uploaded manually using the Web UI or the Artifactory REST API. For Artifactory to handle those packages correctly as PyPI packages they must be uploaded with and pypi.version Properties .

Automatic extraction of properties

While indexing the newly uploaded packages Artifactory will automatically try to extract required properties from the package metadata saved in the file. Note that not all supported files can be extracted.

Currently, only zip, tar, tgz, tar.gz, tar.bz2, egg and whl files can be extracted for metadata.

In addition, indexing starts after a 60 second quiet period, counting from the last upload to the current repository.

Searching for PyPI Packages

Using PIP

Artifactory supports search using pip's search command in local, remote and virtual repositories. For example:

pip search
$ pip search frog-fu --index http://localhost:8080/artifactory/api/pypi/pypi-virtual/
frog-fu                   - 0.2a
  INSTALLED: 0.2a (latest)

$ pip search irbench --index http://localhost:8080/artifactory/api/pypi/pypi-virtual/
irbench                   - Image Retrieval Benchmark.

In this example frog-fu is a locally installed package, while irbench is found at, both repositories aggregated by the pypi-virtual repository.

Specifying the index

When using the search command, the index should be specified explicitly (without the /simple at the end), as pip will ignore the index-url variable in its pip.conf file.

Artifactory Search

PyPI packages can also be searched for using Artifactory's Property Search. All PyPI packages have the properties, pypi.version and pypi.summary set by the uploading client, or later during indexing for supported file types.

Viewing Metadata of PyPI Packages

Artifactory lets you view selected metadata of a PyPI package directly from the UI.

In the Artifacts module Tree Browser, drill down to select the file you want to inspect. The metadata is displayed in the PyPI Info tab.

PyPI Info

Watch the Screencast



  • No labels