2010-09-23 6 views
0

У меня есть модуль python, который разделяется между несколькими моими проектами (проекты имеют разные рабочие каталоги). Одна из функций этого общего модуля выполняет скрипт с использованием os.spawn. Проблема в том, что я не уверен, какой путь указывать на os.spawn, так как я не знаю, как будет работать текущий рабочий каталог при вызове функции. Как я могу ссылаться на файл таким образом, чтобы любой вызывающий абонент мог его найти? Благодаря!Определение имени пути файла из разных рабочих каталогов в python

ответ

1

Так что я только что узнал о переменной __file__, которая обеспечит решение моей проблемы. Я могу использовать файл, чтобы получить имя пути, которое будет постоянным среди всех проектов, и использовать его для ссылки на сценарий, который мне нужно вызвать, поскольку сценарий всегда будет находиться в том же месте относительно __file__. Тем не менее, я открыт для других/лучших методов, если у кого их есть.

+0

Вы имеете в виду «__file__», разметка SO делает его жирным. –

+0

Вы можете изменить __file__ на '__file__', поместив обратные элементы (') вокруг строки. В редакторе есть кнопка (она выглядит как «101 \ n010»), чтобы сделать то же самое. – unutbu

+0

Обычно лучше использовать 'os.path.abspath (__ file __)', чтобы получить полный путь к модулю, чтобы любые последующие изменения в CWD не нарушали его. – bobince

0

Поместите его в известную директорию (/ usr/lib/yourproject/or ~/lib или что-то подобное) или используйте ее в известном относительном пути, основанном на местоположении ваших исходных файлов, которые его используют.

0

Следующий фрагмент кода будет найти местоположение вызывающего модуль, который имеет смысл с точки программиста зрения:

## some magic to allow paths relative to calling module 
    if path.startswith('/'): 
     self.path = path 
    else: 
     frame = sys._getframe(1) 
     base = os.path.dirname(frame.f_globals['__file__']) 
     self.path = os.path.join(base, path) 

Т.е. если ваш проект живет в/home/foo/project, и вы хотите ссылаться на скрипт «myscript» в скриптах /, вы можете просто передать «scripts/myscript». Фрагмент будет определять, что вызывающий объект находится в/home/foo/project, и весь путь должен быть/home/foo/projects/scripts/myscript.

В качестве альтернативы, вы всегда можете потребовать от программиста указать полный путь и проверить с помощью os.path.exists, если он существует.

0

Возможно, вы найдете материалы в этой презентации PyCon 2010 по адресу cross platform application development and distribution. Одна из проблем, которые они решают, заключается в постоянном поиске файлов данных на разных платформах, а также для установленных версий проверки разработки кода.

Смежные вопросы