Python

Pip Freeze Diff

Compares two pip freeze outputs and reports every package that was added, removed, upgraded or downgraded.

Loading the tool…

Processing happens locally in your browser. What you paste or load is processed by this page and is not uploaded to a server. Nothing is stored unless you use a control that says it stores something, and you can clear anything this site has kept from the privacy page.

How to use this tool

  1. Run pip freeze in the first environment and paste the output into the upper box.
  2. Do the same in the second environment and paste it into the lower box.
  3. Select Compare the two. Unchanged packages are hidden unless you turn that off.
  4. Look at the downgrades first — they usually point at whatever forced the resolver's hand.

What pip freeze diff does

"It works on my machine" is nearly always a question about two lists of package versions, and comparing them by eye is miserable — pip freeze sorts alphabetically, so a hundred identical lines sit between the four that differ. Paste one environment into each box and only the differences come back, each labelled as added, removed, upgraded or downgraded.

The direction of a version change is worked out by comparing the version numbers segment by segment, so 1.10 correctly beats 1.9, and a pre-release like 2.0rc1 correctly sorts below 2.0 rather than above it. A downgrade is usually the interesting row: it means a resolver picked an older version to satisfy something else, and that something else is often the actual cause of whatever you are chasing. Unchanged packages are hidden by default and can be shown if you want the full picture.

Frequently asked questions

Segment by segment rather than as text, so 1.10 correctly sorts above 1.9 instead of below it. Where a segment is not a number — a pre-release like rc1 or b2 — it sorts below a numeric segment, so 2.0 beats 2.0rc1, which matches the way Python itself orders releases.

Because nobody usually asked for it. An upgrade is normally deliberate; a downgrade generally means the resolver picked an older version to satisfy some other package's constraint. That other package is often the actual cause of whatever behaviour sent you here in the first place, so the downgraded row is a good place to start looking.

Yes, and it will parse, but read the result carefully. A requirements file often carries ranges rather than exact pins, and a range cannot be compared meaningfully against another range. Lines without an exact == are shown with their specifier so you can see what happened rather than getting a confident but meaningless answer.