Справедливости ради, проблему с requirements.txt пытались решить. Есть целый такой проект, простите за мат - опенстековский, который называется pbr. pbr - это хаки над setuptools (которые хаки над distutils, как известно), которые появились потому что в setuptools нет хуков. и там это решено статической конфигурацией в духе distutils2 + рядом convention over configuration. Например, он по умолчанию берет install_requires из requirements.txt, а также test_requires из test-requirements.txt
В целом, это работает, и когда работает, то работает хорошо. Но часто pbr вызывает мозголомные проблемы при сборке, причем слабо документированные. И тогда в
setup.py появляются разные setup_requires=["pbr>=1.8"] и прочие, то есть срезы версий, которые очень плохо документированы (а если и документированы, то только в мейллистах опенстека). Да и сам pbr документирован довольно скудно, очень многое выясняется в процессе чтения исходников.
Из свинского - он требует, чтобы проект обязательно был под гитом, чтобы вычислить версию. Когда проект под гитом, то вычисляет ее он красиво и очень мило, даже думать не нужно. Нет - то пакет ты не соберешь.
Пакетирование до сих пор большая проблема в Питоне. Периодически кто-то заявляет, что проблем больше нет, но обычно это все довольно скверные утверждения. Мой текущий проект, например, собирается только с setuptools >= 26 только потому, что младшие версии взрываются на большом количестве package_data. Это мило.