Python PyPi staging server and packaging, testing, release tool

Overview

devpi: PyPI server and packaging/testing/release tool

This repository contains three packages comprising the core devpi system on the server and client side:

  • devpi-server: for serving a pypi.org consistent caching index as well as user or team based indexes which can inherit packages from each other or from the pypi.org site.
  • devpi-web: plugin for devpi-server that provides a web and search interface
  • devpi-client: command line tool with sub commands for creating users, using indexes, uploading to and installing from indexes, as well as a "test" command for invoking tox.

For getting started, more docs see https://doc.devpi.net/

Holger Krekel, Florian Schulze, April 2017 (contact us at office at merlinux.eu for support contracts and paid help)

Comments
  • ConnectionResetError(104, 'Connection reset by peer'))

    ConnectionResetError(104, 'Connection reset by peer'))

    Hello. First, I would like to say thank you to all contributors for this great project.

    I'm running a Devpi server version 4.6.0 in the office with Python 3.5.1. It serves quite well but I seldom found ConnectionResetError(104, 'Connection reset by peer')) in the log file. The complete error is:

    2018-10-05 11:19:40,904 ERROR [req3309] [Rtx505] Error during httpget of https://pypi.org/simple/000/
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 377, in _make_request
        httplib_response = conn.getresponse(buffering=True)
    TypeError: getresponse() got an unexpected keyword argument 'buffering'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 560, in urlopen
        body=body, headers=headers)
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 379, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.5/http/client.py", line 1197, in getresponse
        response.begin()
      File "/usr/lib/python3.5/http/client.py", line 297, in begin
        version, status, reason = self._read_status()
      File "/usr/lib/python3.5/http/client.py", line 258, in _read_status
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
      File "/usr/lib/python3.5/socket.py", line 575, in readinto
        return self._sock.recv_into(b)
      File "/usr/lib/python3.5/ssl.py", line 929, in recv_into
        return self.read(nbytes, buffer)
      File "/usr/lib/python3.5/ssl.py", line 791, in read
        return self._sslobj.read(len, buffer)
      File "/usr/lib/python3.5/ssl.py", line 575, in read
        v = self._sslobj.read(len, buffer)
    ConnectionResetError: [Errno 104] Connection reset by peer
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/requests/adapters.py", line 376, in send
        timeout=timeout
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 610, in urlopen
        _stacktrace=sys.exc_info()[2])
      File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 247, in increment
        raise six.reraise(type(error), error, _stacktrace)
      File "/usr/lib/python3/dist-packages/six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 560, in urlopen
        body=body, headers=headers)
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 379, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.5/http/client.py", line 1197, in getresponse
        response.begin()
      File "/usr/lib/python3.5/http/client.py", line 297, in begin
        version, status, reason = self._read_status()
      File "/usr/lib/python3.5/http/client.py", line 258, in _read_status
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
      File "/usr/lib/python3.5/socket.py", line 575, in readinto
        return self._sock.recv_into(b)
      File "/usr/lib/python3.5/ssl.py", line 929, in recv_into
        return self.read(nbytes, buffer)
      File "/usr/lib/python3.5/ssl.py", line 791, in read
        return self._sslobj.read(len, buffer)
      File "/usr/lib/python3.5/ssl.py", line 575, in read
        v = self._sslobj.read(len, buffer)
    requests.packages.urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/lib/python3.5/dist-packages/devpi_server/main.py", line 288, in httpget
        timeout=timeout or self.config.args.request_timeout)
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 480, in get
        return self.request('GET', url, **kwargs)
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 468, in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 576, in send
        r = adapter.send(request, **kwargs)
      File "/usr/lib/python3/dist-packages/requests/adapters.py", line 426, in send
        raise ConnectionError(err, request=request)
    requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
    

    It looks like Pypi gave up the connection due to some reasons. Is this a known issue? Is there anyway to fix this?

    Thanks in advance.

    devpi-server investigate 
    opened by herry13 46
  • Add option to devpi-server to force full pypi index refresh

    Add option to devpi-server to force full pypi index refresh

    • Bitbucket: https://bitbucket.org/hpk42/devpi/issue/59
    • Originally reported by: @thomasf
    • Originally created at: 2013-10-26T19:06:39.607

    For reference: My organisations devpi server somehow failed to keep in sync with the central pypi server, the latest version of django was not available even though days had passed since its release.
    I asked about forcing an full index refresh on the devpi irc channel and hpk procided an manual solution of deleting all mirrored packages which worked just fine:

    1. stop server
    2. rm -rf ~/.devpi/server/root/pypi
    3. restart server
    opened by devpi-bot 38
  • Move to GitHub, need user names

    Move to GitHub, need user names

    • Bitbucket: https://bitbucket.org/hpk42/devpi/issue/389
    • Originally reported by: @fschulze
    • Originally created at: 2017-02-23T16:17:19.055

    We are preparing the move from Bitbucket to GitHub. For that we need to have a user name mapping, so notifications on ticket changes still reach everyone involved. We mapped most of the users, but the following users we either couldn't find on GitHub, or we aren't sure it's the correct user.

    First the names that appear in open tickets and would most likely want a proper mapping to get notifications in the future:

    @adrpp @aostr123 @carlososiel @cdunklau @fabian_snovna @glurk @hoefling @hoel @hoganman @jack_murphy @jblackburnsx @jcastets @jeroen1205 @lbrack @makefu @mandshaw @notsqrt @pendletongp @sbadia @sietsebb @sradhak @troyswanson @ub_marco @ValleChiara @wcooley @zealot0630 @zirpu

    And here all users that appear only in closed issues:

    @basti @beatpanic @benoit-dunandlaisin @bjacobowski @blaffoy_cfp @boosh @brouberol @bruno @carlio @chadawagner @davedash @diegor @eeaston @efren @esn89 @frainbird @gonvaled @grzegorz_dubicki @heyvaerm @href @hurie83 @igan @jacobgeiger @jdoherty1 @jgeessel @jholloway7 @jlyheden @josemanimala @josh_kuhn @jshridha @juliankrause @justinsr20 @kenfar @kgk @kieranbrownlees @kostialopuhin @kpatter @kyle_rockman @ludwigf @lvtstx @martinfiers @martinhoefling @matt_jd @matthias87 @max_gasner @maximilien_riehl_ @mcoupland @metalseargolid @mhuber @ModZero @nolar @onlynone @pasha_savchenko @paullogston @plinioga @pquentin @private @prologic @riehlm @s0lst1c3 @shaenisch @shriyanshagnihotri @stefanocrosta @tcalmant @vacplac @vortec

    Please tell us your GitHub user name in this ticket if you care about notifications.

    I hope notifications to everyone are properly sent for this ticket.

    opened by devpi-bot 36
  • Devpi USES more and more memory

    Devpi USES more and more memory

    I'm using devpi on ubuntu for about 5 months.

    Recently I found devpi's memory usage is up to 7Gi.

    In my scenario, I use postgresql for storage python packages. Usually there are about 100 visits to devpi-server. At first, devpi only use 2Gi memory, and about 3 months ago, I saw it maybe 4Gi. But today, I found the memory devpi use is close to 7Gi, even no one use, it would be about 4Gi cost.

    I can't let the memory keep growing, Maybe Database bottleneck? Or I should storage package local? If so, how can I move package in postgresql to local safely? Please give me any suggestion, thanks!

    bug devpi-server investigate 
    opened by zhangsimingshannonai 33
  • devpi client installations fail to install modules - same installation with pip works fine

    devpi client installations fail to install modules - same installation with pip works fine

    Hi.

    Environment

    • MacOS Sierra, High Sierra - latest versions
    • Python 3.6.3 and 3.6.4 from Homebrew - latest versions
    • Virtual environment - no "raw" devpi client install on the Homebrew Python
    • Six projects, 3 different programmers affected
    • devpi-server 4.3.2 on a dedicated machine on AWS (ports 80, 443); OR
    • Dockerized devpi-server 4.3.2 on localhost (port 3141)
    • No plug-ins
    • devpi-client 4.0.0 with devpi-common 3.2.0 run from Homebrew Python (/usr/local/bin) and/or in the virtual environment work space - same effect

    devpi vs pip - general use, public PyPI package

    devpi + pytest

    (bergen) [0 :) ciurana@nena bergen $] devpi install pytest
    -->  /Users/ciurana/meltwater/bergen$ bin/pip install -U -i http://$SERVER_NAME/blah/dev/+simple/ pytest  [PIP_PRE=1,PIP_USE_WHEEL=1]
    Collecting pytest
      Downloading http://$SERVER_NAME/root/pypi/+f/5f7/a1be1015c59c6/pytest-3.3.2-py2.py3-none-any.whl (185kB)
        100% | 194kB 5.0MB/s
    Requirement already up-to-date: pluggy<0.7,>=0.5 in ./lib/python3.6/site-packages (from pytest)
    Requirement already up-to-date: py>=1.5.0 in ./lib/python3.6/site-packages (from pytest)
    Requirement already up-to-date: attrs>=17.2.0 in ./lib/python3.6/site-packages (from pytest)
    Requirement already up-to-date: setuptools in ./lib/python3.6/site-packages (from pytest)
    Requirement already up-to-date: six>=1.10.0 in ./lib/python3.6/site-packages (from pytest)
    Installing collected packages: pytest
    Successfully installed pytest-3.3.2
    
    (bergen) [0 :) ciurana@nena bergen $] pip install -e . && bin/pytest -v ./test
    Obtaining file:///Users/ciurana/meltwater/bergen
    Requirement already satisfied: amqp in ./lib/python3.6/site-packages (from fhai-avtale==1.8.dev2)
    .
    .
    <snip - lots of the same>
    .
    .
    Installing collected packages: fhai-avtale
      Running setup.py develop for fhai-avtale
    Successfully installed fhai-avtale
    Traceback (most recent call last):
      File "bin/pytest", line 7, in <module>
        from pytest import main
    ModuleNotFoundError: No module named 'pytest'
    

    pip install + pytest

    (bergen) [0 :) ciurana@nena bergen $] pip install pytest
    Collecting pytest
      Using cached pytest-3.3.2-py2.py3-none-any.whl
    Requirement already satisfied: pluggy<0.7,>=0.5 in ./lib/python3.6/site-packages (from pytest)
    Requirement already satisfied: py>=1.5.0 in ./lib/python3.6/site-packages (from pytest)
    Requirement already satisfied: attrs>=17.2.0 in ./lib/python3.6/site-packages (from pytest)
    Requirement already satisfied: setuptools in ./lib/python3.6/site-packages (from pytest)
    Requirement already satisfied: six>=1.10.0 in ./lib/python3.6/site-packages (from pytest)
    Installing collected packages: pytest
    Successfully installed pytest-3.3.2
    
    (bergen) [0 :) ciurana@nena bergen $] pip install -e . && bin/pytest -v ./test
    Obtaining file:///Users/ciurana/meltwater/bergen
    Requirement already satisfied: amqp in ./lib/python3.6/site-packages (from fhai-avtale==1.8.dev2)
    <snip>
    ===== test session starts ======
    platform darwin -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0 -- /Users/ciurana/meltwater/bergen/bin/python3.6
    cachedir: .cache
    rootdir: /Users/ciurana/meltwater/bergen, inifile:
    collecting 21 items
    <snip>
    ===== 109 passed in 13.82 seconds =====
    

    devpi against private packages in devpi private repository

    For what it's worth: fhai is a namespace package.

    (doc-categorizer) [0 :) ciurana@nena doc-categorizer $] devpi install fhai-doccat
    Collecting fhai-doccat
      Downloading http://$SERVER_NAME/fairhair/dev/+f/1e6/491a25f1f66ab/fhai_doccat-1.0.dev0-py2.py3-none-any.whl
    <snip>
    Installing collected packages: fhai-doccat
    Successfully installed fhai-doccat-1.0.dev0
    
    # From ./bin/dokkat 
    (doc-categorizer) [0 :) ciurana@nena doc-categorizer $] dokkat 
    Traceback (most recent call last):
      File "/Users/ciurana/meltwater/doc-categorizer/bin/dokkat", line 7, in <module>
        from fhai.dockat.server import run
    ModuleNotFoundError: No module named 'fhai'
    

    But if we try this...

    (doc-categorizer) [146 :( ciurana@nena doc-categorizer $] python
    Python 3.6.4 (default, Jan  6 2018, 11:51:15) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from fhai.dockat.server import run
    >>> dir(run)
    ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
    

    The package appears to be available and resolves fine, namespace package and all. There are other variations of these that we can discuss on IRC, etc.

    Thanks in advance 👽🙏🏻

    opened by ciurana 30
  • Unable to invoke 'devpi upload'

    Unable to invoke 'devpi upload'

    • Bitbucket: https://bitbucket.org/hpk42/devpi/issue/367
    • Originally reported by: @hoefling
    • Originally created at: 2016-08-17T15:03:08.017

    Based on this SO question of mine. Getting the same error no matter what upload parameters I specify (tried different formats, with-docs, only-docs):

    
    (tstenv) [root@master workspace]# devpi upload --formats sdist
    detected devpi:upload section in /var/lib/jenkins/jobs/myproject-deploy-release/workspace/setup.cfg
    using workdir /tmp/devpi29
    pre-build: cleaning /var/lib/jenkins/jobs/myproject-deploy-release/workspace/dist
    -->  /var/lib/jenkins/jobs/myproject-deploy-release/workspace$ tstenv/bin/python setup.py sdist 
    warning: sdist: standard file not found: should have one of README, README.rst, README.txt
    
    built: /var/lib/jenkins/jobs/myproject-deploy-release/workspace/dist/myproject-1.0.0.dev0.tar.gz [SDIST] 2642.98kb
    usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
       or: setup.py --help [cmd1 cmd2 ...]
       or: setup.py --help-commands
       or: setup.py cmd --help
    
    error: no commands supplied
    Traceback (most recent call last):
      File "/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/bin/devpi", line 11, in <module>
        sys.exit(main())
      File "/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/lib/python3.5/site-packages/devpi/main.py", line 30, in main
        return method(hub, hub.args)
      File "/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/lib/python3.5/site-packages/devpi/upload.py", line 48, in main
        name_version = exported.setup_name_and_version()
      File "/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/lib/python3.5/site-packages/devpi/upload.py", line 311, in setup_name_and_version
        report=False).splitlines()[-1].strip()
      File "/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/lib/python3.5/site-packages/devpi/main.py", line 214, in popen_output
        return check_output(args, cwd=str(cwd))
      File "/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/lib/python3.5/site-packages/devpi_common/proc.py", line 18, in check_output
        raise CalledProcessError(retcode, cmd, output=output)
    subprocess.CalledProcessError: Command '['/var/lib/jenkins/jobs/myproject-deploy-release/workspace/tstenv/bin/python', '/var/lib/jenkins/jobs/myproject-deploy-release/workspace/setup.py', '--name']' returned non-zero exit status 1
    

    Running

    #!python
    python setup.py sdist upload -r reponame
    

    succeeds with response 200, I can confirm the dist file is being uploaded on correct index.

    Running

    #!python
    python setup.py build_sphinx upload_docs --upload-dir path/to/html -r reponame
    

    fails with

    #!python
    ... # sphinx output
    build succeeded, 25 warnings.
    running upload_docs
    Submitting documentation to http://localhost:4050/USER/INDEX
    Upload failed (400): :action field not found
    
    opened by devpi-bot 28
  • how to change default mirror url pypi.python.org/simple/ with devpi-server

    how to change default mirror url pypi.python.org/simple/ with devpi-server

    i start devpi-server version 4.3.0 as cache server with cmd devpi-server --serverdir /root/packages/ --port 5555 --host=0.0.0.0 --start how can i change the default cache mirror?

    opened by robertding 27
  • Basic auth + devpi

    Basic auth + devpi

    • Bitbucket: https://bitbucket.org/hpk42/devpi/issue/331
    • Originally reported by: @bubenkoff
    • Originally created at: 2016-03-31T19:32:58.134

    When the basic auth is set on the frontend server, and you want to use the devpi auth, the basic auth overrides the devpi auth:

    devpi use http://user:[email protected]
    Using basic authentication for 'http://pypi.example.com/'.
    The password is stored unencrypted!
    using server: http://pypi.example.com/ (not logged in)
    no current index: type 'devpi use -l' to discover indices
    ~/.pydistutils.cfg     : no config file exists
    ~/.pip/pip.conf        : no config file exists
    ~/.buildout/default.cfg: no config file exists
    always-set-cfg: no
    
    devpi login --password devpi_password devpi_user
    logged in 'devpi_user', credentials valid for 10.00 hours
    
    devpi use data/pypi
    current devpi index: http://pypi.example.com/data/pypi (not logged in)
    ~/.pydistutils.cfg     : no config file exists
    ~/.pip/pip.conf        : no config file exists
    ~/.buildout/default.cfg: no config file exists
    always-set-cfg: no
    
    devpi index pypi_whitelist='*'
    /data/pypi changing pypi_whitelist: ['*']
    PATCH http://pypi.example.com/data/pypi
    401 user 'user' does not exist: 401 user 'user' does not exist
    
    opened by devpi-bot 25
  • Use

    Use "X-Devpi-Auth" header instead of overriding Authorize header

    • Bitbucket: https://bitbucket.org/hpk42/devpi/issue/75
    • Originally reported by: @hpk42
    • Originally created at: 2013-11-23T21:33:18.458

    devpi / devpi-server should not use the "Authorize" header except for the actual login operation. This allows to use https://user:password@... urls and handling authentication at the "fronting" web server without interferences from devpi-client.

    opened by devpi-bot 24
  • Enable inheriting from external index (other than pypi.python.org)

    Enable inheriting from external index (other than pypi.python.org)

    • Bitbucket: https://bitbucket.org/hpk42/devpi/issue/12
    • Originally reported by: @vmalloc
    • Originally created at: 2013-07-08T16:05:17.826

    Assuming one have a pypi clone running in-house, he may want to use that URL as the root of his or her setup, and not the global pypi.

    If this is already supported, please describe how it can be achieved...

    opened by devpi-bot 24
  • "devpi-server --status" does not work anymore due to waitpid() in isrunning()

    The os.waitpid() call in isrunning() (server/devpi_server/vendor/xprocess.py) causes "devpi-server --status" to not work anymore, because waitpid() requires, that the waited-for process is a child process of the current process, which is not the case, so that a ChildProcessError (Python 3, subclass of OSError) or OSError (Python 2) is raised and isrunning() returns false, although the devpi-server process is running.

    wontfix 
    opened by devpiuser 22
  • Properly set PATH_INFO when X-outside-url header with path is used

    Properly set PATH_INFO when X-outside-url header with path is used

    When the X-outside-url header is passed in a request to devpi-server, the path portion is set as the wsgi SCRIPT_NAME variable so it can run in a subpath. However, the wsgi spec [1] states that SCRIPT_NAME and PATH_INFO together constitute the complete URL but PATH_INFO isn't modified. This commit adds stripping of the SCRIPT_NAME from the beginning of PATH_INFO.

    [1] https://wsgi.readthedocs.io/en/latest/definitions.html#standard-environ-keys


    For reference, here are two minimal configs for traefik and nginx to to serve devpi on the sub path /devpi

    nginx.conf

    server {
        location /devpi {
            proxy_set_header X-outside-url $scheme://$http_host/devpi;
            proxy_pass http://localhost:3141;
        }
    }
    

    traefik labels (for running in docker-compose)

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.devpi.rule=PathPrefix(`/devpi`)"
      - "traefik.http.routers.devpi.middlewares=devpi-outside-url"
      - "traefik.http.middlewares.devpi-outside-url.headers.customrequestheaders.X-outside-url=http://localhost/devpi"
    
    opened by daniel-k 4
  • Homepage causes redirect (302) loop when using Outside URL w/ path

    Homepage causes redirect (302) loop when using Outside URL w/ path

    On a fresh install, requests on / result in a 302 response to the same path, causing a redirect loop.

    Example request without X-Outside-URL:

    $ curl -q -s -i 'http://localhost:3141'
    HTTP/1.1 200 OK
    Content-Length: 5985
    Content-Type: text/html; charset=UTF-8
    ...
    
    $ curl -q -s -i 'http://localhost:3141/root/pypi'
    HTTP/1.1 200 OK
    Content-Length: 6010
    Content-Type: text/html; charset=UTF-8
    ...
    

    W/ X-outside-url but without a path component; also working as expected:

    $ curl -q -s -i -H 'X-outside-url: http://foo.bar' 'http://localhost:3141/root/pypi'
    HTTP/1.1 200 OK
    Content-Length: 5919
    Content-Type: text/html; charset=UTF-8
    ...
    
    ~/dev/forensics DE-467_binning-workflow*
    $ curl -q -s -i -H 'X-outside-url: http://foo.bar' 'http://localhost:3141'
    HTTP/1.1 200 OK
    Content-Length: 5901
    Content-Type: text/html; charset=UTF-8
    ...
    

    But (assuming a reverse proxy setup that redirects /devpi -> /) a request with a X-outside-url header containing a path causes a redirect to the same path:

    $ curl -q -s -i -H 'X-outside-url: http://foo.bar/devpi' 'http://localhost:3141'
    'HTTP/1.1 302 Found
    Content-Length: 188
    Content-Type: text/html; charset=UTF-8
    Date: Thu, 03 Nov 2022 01:41:56 GMT
    Location: http://foo.bar/devpi
    ...
    
    $ curl -q -s -i -H 'X-outside-url: http://foo.bar/devpi' 'http://localhost:3141/root/pypi'
    HTTP/1.1 200 OK
    Content-Length: 5997
    Content-Type: text/html; charset=UTF-8
    ...
    

    The only endpoint that seems to be affected is /


    $ python -V
    Python 3.8.13
    
    $ pip list
    devpi-client             6.0.2
    devpi-common             3.7.0
    devpi-ldap               2.1.0
    devpi-postgresql         3.0.1
    devpi-server             6.7.0
    devpi-web                4.1.1
    
    bug devpi-web 
    opened by qubidt 0
  • is there a setup possible that allows whitelisting from one base but not the other?

    is there a setup possible that allows whitelisting from one base but not the other?

    Is it possible to add intermediate indexes such that I could effectively create a different whitelist based on the base (or mirror in this case) ?

    In this scenario: helloworld==1 might be on root/something-else, and helloworld==2 is on production, but we want to make sure to not accidently grab helloworld from root/pypi

    flowchart TD
        production --whitelist=* --> root/something-else
        production --whitelist=none--> root/pypi
    

    If the "why" matters: I was hoping offload really old releases from our devpi server to a different server. This would save disk space on my primary server my replicas. Sure they may mirror the versions most needed, but it wouldn't be N replicas with ALL the old versions.

    Any ideas/feedback would be appreciated. Thank you.

    opened by krpatter-intc 3
  • Need help with scaling my devpi instance for CI testing

    Need help with scaling my devpi instance for CI testing

    Hi there!

    Looking to hopefully get some possible solutions/alternatives to the issues I'm having with my devpi setup.


    I'm writing a CI system for running Python unit tests for multiple python github repos at once using pre-released versions of the software.

    Say I change project A, which is used heavily by projects B and C. In the CI for A I want to run pytests for project B and C, and additionally run their tests for each interpreter version our clients use for those projects. In this scenarios I need to test 3 projects and say 3 interpreter versions each, which means I create 9 virtual environments and run pytest in them, and additionally each environment needs to include the overriden version of A. In some scenarios I want to make cross cutting changes to these repos, in which case the virtual environments would be multiple overrides of packages.

    Previously before trying devpi, my strategy has been to create the virtual environments like normal, and then before running pytest in the virtual environment, to run say pip install --no-deps /path/to/A. This has been really awkward and when the code includes new dependencies, and making the decisions of which projects actually need what dependencies gets complicated when I'm changing multiple repos at once for cross cutting changes.

    With devpi my current idea is to simplify the workflow by just uploading the sdist of changed repos to a devpi index and referencing that in my pip config before creating any virtual environments for the other projects. My devpi index has a has a base index which mirrors our internal pypi instance. The devpi server is to be very short lived, as I only want to keep it for the lifetime of the CI test run. In my setup I'm using Argo workflows which is similar to a docker-compose setup of sorts, where I create a devpi server daemon that is referenced in other container pip.conf's which actually create virtual environments and run the pytest commands.

    My server setup looks like this:

    devpi-init --no-root-pypi
    devpi-server --threads 32 --host="${DEVPI_HOST}" --port="${DEVPI_PORT}"
    

    I create the indices like this:

    devpi use "http://${DEVPI_HOST}:${DEVPI_PORT}/root"
    devpi login root --password=""
    devpi index -c root/pypi type=mirror "mirror_url=$DEVPI_MIRROR" volatile=False
    devpi index -c root/dev bases=root/pypi volatile=True
    

    And the pip.conf looks like this:

    [global]
    index-url = http://${DEVPI_HOST}:${DEVPI_PORT}/root/dev/+simple/
    trusted-host = ${DEVPI_HOST}
    disable-pip-version-check = true
    
    [search]
    index = http://${DEVPI_HOST}:${DEVPI_PORT}/root/dev/
    

    Everything seemed like it was going fine until the amount of virtual environments I wanted to test from increased to ~15. Then I started seeing lines in the devpi-server like this:

    2022-10-28 00:09:28,000 WARNI Task queue depth is 61
    2022-10-28 00:09:28,076 WARNI Task queue depth is 62
    2022-10-28 00:09:28,537 WARNI Task queue depth is 63
    2022-10-28 00:09:28,538 WARNI Task queue depth is 64
    2022-10-28 00:09:28,549 WARNI Task queue depth is 65
    2022-10-28 00:09:28,549 WARNI total open connections reached the connection limit, no longer accepting new connections
    

    Which causes issues like this in the pip install (which doesn't happen when the traffic is lower)

    WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f4415318e80>, 'Connection to X.Y.Z.W timed out. (connect timeout=15)')': /root/dev/+simple/isort/
    ERROR: Could not find a version that satisfies the requirement isort>=5 (from versions: none)
    ERROR: No matching distribution found for isort>=5
    

    I'm then also getting a lot of errors by probably stressing the heck out of the sqlite storage from too many request threads (See the bottom for full stack trace).

    2022-10-28 03:55:57,391 ERROR Exception while serving /root/dev/+simple/pip/
    Traceback (most recent call last):
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/tweens.py", line 13, in _error_handler
        response = request.invoke_exception_view(exc_info)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/view.py", line 786, in invoke_exception_view
        raise HTTPNotFound
    pyramid.httpexceptions.HTTPNotFound: The resource could not be found.
    During handling of the above exception, another exception occurred:
    ...
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs_sqlite.py", line 315, in get_connection
        sqlconn.execute("begin immediate")
    sqlite3.OperationalError: database is locked
    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
    ...
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs_sqlite.py", line 91, in rollback
        self._sqlconn.rollback()
    sqlite3.ProgrammingError: Cannot operate on a closed database.
    

    Interestingly I was getting errors very infrequently when using older versions of the library. I tried updating the libraries to see if that would help and am now I've started getting even more errors.

    Also note that our PyPI server is massive. I see lines like Processed a total of +200k projects and queued +200k, and many many lines like Committing 2500 new documents to search index..


    Questions:

    1. Can I limit the amount of caching devpi is doing of the mirrored base index?

    All I really want is a way that can always pin my pip install to choosing the sdist of my per-released python package under test. I don't care about the local caching aspects of it all for the upstream logic, as after I create the few virtual environments I'm just going to throw the works of this away. I imagine a lot of the sqlite errors are from trying to cache the mirrored pypi index. Or is caching the pypi state of the mirrored index required to be able to do this replacement in the first place?

    1. Is there a way I can have the server do a better job of queuing incoming requests?

    I'd like to be able to somehow throttle the requests rather than just refusing new connections. Its unclear to me how this decision is being made... I assume it's something with the underlying waitress library, but it seems there's only limited ways to configure it. I see a connection_limit argument in the serve method but as far as I can tell I have no way to configure it. Also maybe there's also something I could be configuring in my pip.conf to make me more tolerant to this?

    1. For this case, would you recommend me using the postgresql extension instead of sqlite? https://pypi.org/project/devpi-postgresql/

    Imagine this could help with the db contention I'm getting writing to disk. Don't mind setting this up, but it makes it again a bit more complicated and the main goal of this whole thing was aiming to simplify the CI setup.

    Other things I'm considering is creating a devpi server per every 5-10 virtual environments I want to test in the CI run, or by limiting the overall parallelism of how many virtual environments are being created at once.

    Thanks so much!


    Are you using the latest released version?

    Yep

    devpi-client==6.0.2
    devpi-common==3.7.0
    devpi-server==6.7.0
    devpi-web==4.1.1
    

    Previously I had these versions which gave less errors than what I have now:

    devpi-client==5.2.3
    devpi-common==3.6.0
    devpi-server==6.5.1
    devpi-web==4.0.8
    

    Provide the output of pip list from the virtual environment you are using.

    bash-4.3$ pip3.10 list | sort
    --------------------------------- -------------------------
    Chameleon                         3.9.0
    Package                           Version
    PasteDeploy                       3.0.1
    Pygments                          2.13.0
    WebOb                             1.8.7
    Whoosh                            2.7.4
    aiohttp                           3.8.3
    aiosignal                         1.2.0
    argon2-cffi                       21.3.0
    argon2-cffi-bindings              21.2.0
    async-timeout                     4.0.2
    attrs                             22.1.0
    backports.entry-points-selectable 1.1.0
    beautifulsoup4                    4.11.1
    bleach                            5.0.1
    build                             0.9.0
    certifi                           2022.9.24
    cffi                              1.15.1
    charset-normalizer                2.1.1
    check-manifest                    0.48
    cmarkgfm                          2022.10.27
    defusedxml                        0.7.1
    devpi-client                      6.0.2
    devpi-common                      3.7.0
    devpi-server                      6.7.0
    devpi-web                         4.1.1
    distlib                           0.3.2
    docutils                          0.19
    filelock                          3.0.12
    frozenlist                        1.3.1
    hupper                            1.10.3
    idna                              3.4
    itsdangerous                      2.1.2
    lazy                              1.5
    multidict                         6.0.2
    packaging                         21.3
    passlib                           1.7.4
    pep517                            0.13.0
    pip                               22.2.2
    pkginfo                           1.8.3
    plaster                           1.0
    plaster-pastedeploy               0.7
    platformdirs                      2.3.0
    pluggy                            1.0.0
    py                                1.11.0
    pycparser                         2.21
    pyparsing                         3.0.9
    pyramid                           2.0
    pyramid-chameleon                 0.3
    python-dateutil                   2.8.2
    readme-renderer                   37.2
    repoze.lru                        0.7
    requests                          2.28.1
    ruamel.yaml                       0.17.21
    ruamel.yaml.clib                  0.2.7
    setuptools                        60.8.2
    six                               1.16.0
    soupsieve                         2.3.2.post1
    strictyaml                        1.6.2
    tomli                             2.0.1
    translationstring                 1.4
    urllib3                           1.26.12
    venusian                          3.0.0
    virtualenv                        20.7.2
    waitress                          2.1.2
    webencodings                      0.5.1
    wheel                             0.36.2
    yarl                              1.8.1
    zope.deprecation                  4.4.0
    zope.interface                    5.5.0
    

    Provide the Python and operating system versions under which the issue occurs.

    I'm on python3.10 and using RHEL 7.9 (running in a docker container).

    If possible, provide a minimal example to reproduce the issue.

    Can whip something up if needed. Seems to be caused when pip installing in parallel from a lot of projects.

    ...

    db stack I was getting:

    2022-10-28 03:55:57,391 ERROR Exception while serving /root/dev/+simple/pip/
    Traceback (most recent call last):
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/tweens.py", line 13, in _error_handler
        response = request.invoke_exception_view(exc_info)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/view.py", line 786, in invoke_exception_view
        raise HTTPNotFound
    pyramid.httpexceptions.HTTPNotFound: The resource could not be found.
    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 389, in transaction
        yield tx
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/views.py", line 226, in request_tx_handler
        response = handler(request)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_web/views.py", line 106, in request_trailing_slash_redirect_handler
        return handler(request)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/tweens.py", line 43, in excview_tween
        response = _error_handler(request, exc)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/tweens.py", line 17, in _error_handler
        reraise(*exc_info)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/util.py", line 733, in reraise
        raise value
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/tweens.py", line 41, in excview_tween
        response = handler(request)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/router.py", line 143, in handle_request
        response = _call_view(
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/view.py", line 674, in _call_view
        response = view_callable(context, request)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/viewderivers.py", line 392, in viewresult_to_response
        result = view(context, request)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/viewderivers.py", line 113, in _class_requestonly_view
        response = getattr(inst, attr)()
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/views.py", line 574, in simple_list_project
        stage.get_simplelinks(
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/model.py", line 895, in get_simplelinks
        for stage, res in self.op_sro_check_mirror_whitelist(
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/model.py", line 1065, in op_sro_check_mirror_whitelist
        res = getattr(stage, opname)(**kw)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/mirror.py", line 736, in get_simplelinks_perstage
        return self._update_simplelinks(project, info, links, newlinks)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/mirror.py", line 596, in _update_simplelinks
        self.keyfs.restart_as_write_transaction()
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 362, in restart_as_write_transaction
        tx.restart(write=True)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 691, in restart
        newtx = self.__class__(self.keyfs, write=write)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 478, in __init__
        self.conn
      File "/path/to/my/install/lib/python3.10/site-packages/lazy/lazy.py", line 36, in __get__
        inst.__dict__[name] = value = self.__func(inst)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 492, in conn
        return self.keyfs.get_connection(
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 235, in get_connection
        self._storage.get_connection(closing=False, write=write))
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs_sqlite.py", line 315, in get_connection
        sqlconn.execute("begin immediate")
    sqlite3.OperationalError: database is locked
    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
      File "/path/to/my/install/lib/python3.10/site-packages/waitress/channel.py", line 428, in service
        task.service()
      File "/path/to/my/install/lib/python3.10/site-packages/waitress/task.py", line 168, in service
        self.execute()
      File "/path/to/my/install/lib/python3.10/site-packages/waitress/task.py", line 434, in execute
        app_iter = self.channel.server.application(environ, start_response)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/middleware.py", line 21, in __call__
        return self.app(environ, start_response)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/router.py", line 270, in __call__
        response = self.execution_policy(environ, self)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/router.py", line 276, in default_execution_policy
        return router.invoke_request(request)
      File "/path/to/my/install/lib/python3.10/site-packages/pyramid/router.py", line 245, in invoke_request
        response = handle_request(request)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/views.py", line 190, in request_log_handler
        response = handler(request)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/views.py", line 224, in request_tx_handler
        with keyfs.transaction(write=write) as tx:
      File "/opt/bb/lib/python3.10/contextlib.py", line 153, in __exit__
        self.gen.throw(typ, value, traceback)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 391, in transaction
        self.rollback_transaction_in_thread()
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 375, in rollback_transaction_in_thread
        self._threadlocal.tx.rollback()
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs.py", line 679, in rollback
        self.conn.rollback()
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs_sqlite_fs.py", line 73, in rollback
        BaseConnection.rollback(self)
      File "/path/to/my/install/lib/python3.10/site-packages/devpi_server/keyfs_sqlite.py", line 91, in rollback
        self._sqlconn.rollback()
    sqlite3.ProgrammingError: Cannot operate on a closed database.
    
    opened by cal-pratt 9
  • Issue mirroring private gcloud artifacts pypi index

    Issue mirroring private gcloud artifacts pypi index

    I am trying to set up a mirror index for our our companies private index in google cloud artifacts registry.

    this is how i normally install a package from our private repository:

     pip install --index-url https://$PYPI_USER:[email protected]/$BUILDS_PROJECT/pypi/simple/  sample_project
    

    This always works.

    Now I want to mirror the index used above.

    I created this indexes in devpi-server:

    {
        "result": {
            "root": {
                "created": "2022-10-26T14:08:50Z",
                "indexes": {
                    "pypi": {
                        "mirror_url": "https://pypi.org/simple/",
                        "mirror_web_url_fmt": "https://pypi.org/project/{name}/",
                        "title": "PyPI",
                        "type": "mirror",
                        "volatile": false
                    }
                },
                "username": "root"
            },
            "testuser": {
                "created": "2022-10-26T14:34:06Z",
                "indexes": {
                    "all": {
                        "acl_toxresult_upload": [
                            ":ANONYMOUS:"
                        ],
                        "acl_upload": [
                            "testuser"
                        ],
                        "bases": [
                            "testuser/private",
                            "root/pypi"
                        ],
                        "mirror_whitelist": [],
                        "mirror_whitelist_inheritance": "intersection",
                        "type": "stage",
                        "volatile": true
                    },
                    "private": {
                        "mirror_url": "https://$PYPI_USER:[email protected]/$BUILD_PROJECT/pypi/simple/",
                        "type": "mirror",
                        "volatile": true
                    }
                },
                "username": "testuser"
            }
        },
        "type": "list:userconfig"
    }
    

    i then try to install sample_project with:

    pip install --index-url https://localhost:3141/testuser/all/+simple/ sample_project
    

    witch outputs:

    ERROR: Could not find a version that satisfies the requirement fda-terraform-api (from versions: none)
    ERROR: No matching distribution found for fda-terraform-api
    

    in the devpi-server --debug log i see:

    2022-10-27 13:29:15,205 INFO  [req2] GET /testuser/all/+simple/sample_project/
    2022-10-27 13:29:15,206 DEBUG [req2] [Rtx61] in-transaction 61
    2022-10-27 13:29:15,208 DEBUG Starting new HTTPS connection (4): europe-python.pkg.dev:443
    2022-10-27 13:29:15,518 DEBUG https://europe-python.pkg.dev:443 "GET /bulds/pypi/simple/ HTTP/1.1" 404 1449
    2022-10-27 13:29:15,519 WARNI [req2] [Rtx61] upstream error (URL URL('https://user:****@europe-python.pkg.dev/builds/pypi/simple/') returned 404 Not Found): using stale projects list
    2022-10-27 13:29:16,251 DEBUG Starting new HTTPS connection (5): europe-python.pkg.dev:443
    2022-10-27 13:29:16,645 DEBUG https://europe-python.pkg.dev:443 "GET /a-boeingfda-builds/pypi/simple/ HTTP/1.1" 404 1449
    2022-10-27 13:29:16,646 WARNI [req2] [Rtx61] upstream error (URL URL('https://user:****@europe-python.pkg.dev/builds/pypi/simple/') returned 404 Not Found): using stale projects list
    2022-10-27 13:29:17,390 ERROR [req2] [Rtx61] while handling http://localhost:3141/testuser/all/+simple/sample_project/:
    The project fda-terraform-api does not exist.
    2022-10-27 13:29:17,393 DEBUG [req2] [Rtx61] closing transaction at 61
    2022-10-27 13:29:17,393 DEBUG [req2] 404 Not Found 2.188s serial=61 length=5867 type=text/html; charset=UTF-8
    
    opened by pintjuk 7
  • Get rid of pylib

    Get rid of pylib

    FYI, there have been various discussions in pylib recently on how to finally get rid of it (it's been in maintenance mode for a while):

    • https://github.com/pytest-dev/py/issues/287 (the original starting point)
    • https://github.com/pytest-dev/py/issues/288

    Efforts to get rid of it in pytest have been going on since ~2018, and with today's v7.2.0 release, we decided to go forward by removing it and vendoring the only remaining py.path part: https://github.com/pytest-dev/pytest/pull/10396

    Similarly, tox has made efforts to get rid of "py" for its v4 rewrite:

    • https://github.com/tox-dev/tox/issues/592
    • https://github.com/tox-dev/tox/issues/610

    After that's released at some point, I expect devpi to be the only remaining big project depending on it (other than a couple of pytest plugins). At some point, we probably will archive the py project (from what I can gather, people would love to do that immediately, actually).

    I can see various usages across the codebase:

    py.builtin._basestring
    py.builtin._isbytes
    py.builtin._istext
    py.builtin._totext
    py.builtin.bytes
    py.builtin.print_
    py.error.EBUSY
    py.error.EEXIST
    py.error.ENOENT
    py.iniconfig.IniConfig
    py.io
    py.io.BytesIO
    py.io.StdCaptureFD
    py.io.TerminalWriter
    py.io.TextIO
    py.path.local
    py.path.local._gethomedir
    py.path.local.make_numbered_dir
    py.path.local.sysfind
    py.path.local.write
    py.xml
    py.xml.escape
    py.xml.html
    
    • py.builtin should be easy (Python 2 support is a thing of the past, so that might be a search/replace actually)
    • py.path.local is a bit harder, but should be replaceable entirely by pathlib, and probably shutil.which for sysfind. Not sure about make_numbered_dir, pytest seems to have added its own implementation. That should also render py.error useless.
    • py.iniconfig was split into a standalone project for pytest 6 (mid-2020)
    • Some parts of py.io are probably Python 2 compat.
    • py.io.StdCaptureFD seems to be used in tests. Maybe consider private-importing from pytest instead?
    • py.io.TerminalWriter is probably the hardest part of it all... maybe rich instead or something?
    • py.xml and py.xml.html I have no idea about. Probably needs an alternative library if you're building HTML with it.
    opened by The-Compiler 2
Python dependency management and packaging made easy.

Poetry: Dependency Management for Python Poetry helps you declare, manage and install dependencies of Python projects, ensuring you have the right sta

Poetry 23.1k Jan 1, 2023
Python dependency management and packaging made easy.

Poetry: Dependency Management for Python Poetry helps you declare, manage and install dependencies of Python projects, ensuring you have the right sta

Poetry 23.2k Jan 5, 2023
Solaris IPS: Image Packaging System

Solaris Image Packaging System Introduction The image packaging system (IPS) is a software delivery system with interaction with a network repository

Oracle 57 Dec 30, 2022
A PyPI mirror client according to PEP 381 http://www.python.org/dev/peps/pep-0381/

This is a PyPI mirror client according to PEP 381 + PEP 503 http://www.python.org/dev/peps/pep-0381/. bandersnatch >=4.0 supports Linux, MacOSX + Wind

Python Packaging Authority 345 Dec 28, 2022
A PyPI mirror client according to PEP 381 http://www.python.org/dev/peps/pep-0381/

This is a PyPI mirror client according to PEP 381 + PEP 503 http://www.python.org/dev/peps/pep-0381/. bandersnatch >=4.0 supports Linux, MacOSX + Wind

Python Packaging Authority 345 Dec 28, 2022
A tool to upgrade dependencies to the latest versions

pip-check-updates A tool to upgrade dependencies to the latest versions, inspired by npm-check-updates Install From PyPi pip install pip-check-updates

Zeheng Li 12 Jan 6, 2023
Install and Run Python Applications in Isolated Environments

pipx — Install and Run Python Applications in Isolated Environments Documentation: https://pipxproject.github.io/pipx/ Source Code: https://github.com

null 5.8k Dec 31, 2022
An installation and dependency system for Python

Pyflow Simple is better than complex - The Zen of Python Pyflow streamlines working with Python projects and files. It's an easy-to-use CLI app with a

David O'Connor 1.2k Dec 23, 2022
A software manager for easy development and distribution of Python code

Piper A software manager for easy development and distribution of Python code. The main features that Piper adds to Python are: Support for large-scal

null 13 Nov 22, 2022
A set of tools to keep your pinned Python dependencies fresh.

pip-tools = pip-compile + pip-sync A set of command line tools to help you keep your pip-based packages fresh, even when you've pinned them. You do pi

Jazzband 6.5k Dec 29, 2022
The Python Package Index

Warehouse Warehouse is the software that powers PyPI. See our development roadmap, documentation, and architectural overview. Getting Started You can

Python Packaging Authority 3.1k Jan 1, 2023
The Python package installer

pip - The Python Package Installer pip is the package installer for Python. You can use pip to install packages from the Python Package Index and othe

Python Packaging Authority 8.4k Dec 30, 2022
:package: :fire: Python project management. Manage packages: convert between formats, lock, install, resolve, isolate, test, build graph, show outdated, audit. Manage venvs, build package, bump version.

THE PROJECT IS ARCHIVED Forks: https://github.com/orsinium/forks DepHell -- project management for Python. Why it is better than all other tools: Form

DepHell 1.7k Dec 30, 2022
pip-run - dynamic dependency loader for Python

pip-run provides on-demand temporary package installation for a single interpreter run. It replaces this series of commands (or their Windows equivale

Jason R. Coombs 79 Dec 14, 2022
Python Development Workflow for Humans.

Pipenv: Python Development Workflow for Humans [ ~ Dependency Scanning by PyUp.io ~ ] Pipenv is a tool that aims to bring the best of all packaging wo

Python Packaging Authority 23.5k Jan 6, 2023
Simple Library Management made with Python

Installation pip install mysql-connector-python NOTE: You must make a database (library) & and table (books, student) to hold all data. Languange and

SonLyte 10 Oct 21, 2021
PokerFace is a Python package for various poker tools.

PokerFace is a Python package for various poker tools. The following features are present in PokerFace... Types for cards and their componen

Juho Kim 21 Dec 29, 2022
Example for how to package a Python library based on Cython.

Cython sample module This project is an example of a module that can be built using Cython. It is an upgrade from a similar model developed by Arin Kh

Juan José García Ripoll 4 Aug 28, 2022
OS-agnostic, system-level binary package manager and ecosystem

Conda is a cross-platform, language-agnostic binary package manager. It is the package manager used by Anaconda installations, but it may be used for

Conda 5.1k Dec 30, 2022