virtualenv isn't made redundant by Vagrant at all; I use them together all the time. The remote server I deploy to is completely different from my development machine, so I use Vagrant to simulate the remote environment. Since I'm on shared hosting, though, I use virtualenv to make sure that my app isn't depending on shared modules that are out of my control. It's also a LOT more reliable than trying to deal with a userdir python build or pip --user, where you'll probably end up fiddling with envvars anyway, except worse because you'll be doing it by hand instead of through a script.