Interesting tidbit about Linux:
A maximum line length of 127 characters is allowed for the first line in a #! executable shell script.
Should be enough, right? Wrong.
Well, not if you are using
dh_virtualenv with long package
Installing pip... Error [Errno 2] No such file or directory while executing command /tmp/lo...me/bin/easy_install /usr/share/python-virtualenv/pip-1.1.tar.gz ...Installing pip...done. Traceback (most recent call last): File "/usr/bin/virtualenv", line 3, in <module> virtualenv.main() File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 938, in main never_download=options.never_download) File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 1054, in create_environment install_pip(py_executable, search_dirs=search_dirs, never_download=never_download) File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 643, in install_pip filter_stdout=_filter_setup) File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 976, in call_subprocess cwd=cwd, env=env) File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory Traceback (most recent call last): File "/usr/bin/dh_virtualenv", line 106, in <module> sys.exit(main() or 0) File "/usr/bin/dh_virtualenv", line 83, in main deploy.create_virtualenv() File "/usr/lib/python2.7/dist-packages/dh_virtualenv/deployment.py", line 112, in create_virtualenv subprocess.check_call(virtualenv) File "/usr/lib/python2.7/subprocess.py", line 511, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['virtualenv', '--system-site-packages', '--setuptools', 'debian/long-package-name/usr/share/python/long-package-name']' returned non-zero exit status 1 make: *** [binary-arch] Error 1 dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2
dh_virtualenv is used to create Debian packages that include Python
virtualenvs. It is one of the better ways of packaging
Python software, especially if there are Python dependencies that are not
available in Debian or Ubuntu. When building a
.deb package, it
creates a virtualenv in a location such as:
This virtualenv has several tools under its
bin/ directory, and they all have
the absolute path of the virtualenv's Python interpreter hard-coded in their
#! shebang line:
<build-directory> often contains the package name as well, it's
easy to overflow the 128 byte limit of the
#! shebang line. In my case, with
a ~30 character package name, the path length grew to 160 characters!
Consequently, the kernel couldn't find the Python executable anymore, and
running any of the tools from the
bin/ directory gave an
ENOENT (file not
found) error. This is what happened when virtualenv tried to install
during the initial setup. The root cause of this error is not immediately obvious,
to say the least.
To check whether this affects you, check the line length of any script with
head -n 1 /path/to/virtualenv/bin/easy_install | wc -c
If that's larger than 128, it's probably the cause of the problem.
The fix is to change the package name and/or the build location to something shorter. The alternative would be to patch the Linux kernel, which – depending on your preferences – sounds either fun or really unpleasant. Suit yourself!