Как заставить Python использовать путь, содержащий двоеточия? - PullRequest
1 голос
/ 22 апреля 2011

У меня есть программа, которая включает встроенный интерпретатор Python 2.6.Когда я вызываю интерпретатор, я вызываю PySys_SetPath (), чтобы установить путь импорта интерпретатора для подкаталогов, установленных рядом с моим исполняемым файлом, которые содержат мои файлы сценариев Python ... например:

PySys_SetPath("/path/to/my/program/scripts/type1:/path/to/my/program/scripts/type2");

(за исключением того, чтостроки пути генерируются динамически на основе текущего местоположения исполняемого файла моей программы, а не жестко, как в примере выше)

Это работает нормально ... кроме случаев, когда умный пользователь решает установить мою программу подпапка с двоеточием в названии.В этом случае моя команда PySys_SetPath () в конечном итоге выглядит следующим образом (обратите внимание на наличие папки с именем «path: to»):

PySys_SetPath("/path:to/my/program/scripts/type1:/path:to/my/program/scripts/type2");

... и это нарушает все мои скрипты Python, потому чтотеперь Python ищет файлы сценариев в «/ path» и «to / my / program / scripts / type1» вместо «/ path: to / myprogram / scripts / type1», и поэтому ни один из операторов импорта не работает.

У меня такой вопрос, есть ли какое-нибудь решение этой проблемы, кроме указания пользователю избегать двоеточий в именах его папок?

Я посмотрел на функцию makepathobject () в Python / sysmodule.cи, похоже, он не поддерживает какие-либо цитаты или экранирование для обработки буквальных двоеточий ... но, возможно, мне не хватает некоторого нюанса.

Ответы [ 2 ]

6 голосов
/ 22 апреля 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что функция PySys_SetPath анализирует передаваемую строку, используя двоеточие в качестве разделителя.Этот синтаксический анализатор видит каждый символ : как ограничивающий путь, и пути обхода этого нет (не избежать).

Однако вы можете обойти это, создав список отдельных путей(каждая из которых может содержать двоеточия) и использовать PySys_SetObject для установки sys.path:

PyListObject *path; 

path = (PyListObject *)PyList_New(0); 
PyList_Append((PyObject *) path, PyString_FromString("foo:bar")); 
PySys_SetObject("path", (PyObject *)path); 

Теперь интерпретатор увидит "foo:bar" как отдельный компонент sys.path.

2 голосов
/ 22 апреля 2011

Поддержка двоеточий в пути к файлу открывает огромную банку червей в нескольких операционных системах;например, он не является допустимым символом пути в Windows или Mac OS X, и кажется, что не очень разумно поддерживать его в контексте среды сценариев по той же причине.Я на самом деле немного удивлен, что Linux также допускает использование имен файлов двоеточий, тем более что: это очень распространенный символ-разделитель пути.

Вы можете попробовать экранировать двоеточие, то есть преобразовать / path: to / to / path \: / и посмотреть, если это работает.Кроме этого, просто скажите пользователю избегать использования двоеточий в именах файлов.Они столкнутся с различными проблемами в самых разных средах, и это просто плохая идея.

...