clone 484305 -1
reassign -1 vim-python
thanks

Shouldn't Python builds of vim avoid this bug by stopping '' from being
prepended to sys.path in the first place?

After looking through Python initialization and vim's if_python.c it
seems that the way forward is to set Python's argv, via PySys_SetArgv(),
to have a non-empty and absolute first argument.

vim sets Python's argv to  { "", NULL }, which according to a comment is to
avoid a crash when warn() is called. Changing that to { "/usr/bin/vim", NULL }
would seem to solve this problem - but for that matter, any safe value is fine.

A safe value for argv[0] is any value where there won't be files dir/*.py or
dir/*/__init__.py, where dir == dirname(argv[0]). So setting argv[0] to
"/", "/usr/lib/something" or "/usr/share/vim" would be safe too, for instance.

I'm afraid I haven't tested this in vim itself (the multiple builds take a
while...) but the attached program demonstrates it:

[EMAIL PROTECTED] gcc -o484305 `python-config --cflags` `python-config 
--ldflags` 484305.c
[EMAIL PROTECTED] ./484305
(I have no argv!)
['/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2',
... more output ...
'/var/lib/python-support/python2.5/pyinotify']
[EMAIL PROTECTED] ./484305 ""
['']
['', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2',
... more output ...
'/var/lib/python-support/python2.5/pyinotify']
[EMAIL PROTECTED] ./484305 "/usr/bin/vim"
['/usr/bin/vim']
['/usr/bin', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2',
... more output ...
'/var/lib/python-support/python2.5/pyinotify']

Hope this helps,
    Simon
/*
 * Usage:
 * gcc -o484305 `python-config --cflags` `python-config --ldflags` 484305.c
 * ./484305                        <- default behaviour of embedded Python
 * ./484305 ""                     <- what vim does now
 * ./484305 /usr/bin/vim
 * ./484305 /
 * ./484305 /usr/share/vim
 */

#include <Python.h>

int
main(int argc, char **argv)
{
	char *replacement_argv[] = { argv[1], NULL };

	Py_Initialize();

	if (argc >= 2) {
		PySys_SetArgv(1, replacement_argv);
	}

	PyRun_SimpleString("import sys\n"
			   "print getattr(sys, 'argv', '(I have no argv!)')\n"
			   "print sys.path\n");

	return 0;
}

Reply via email to