У меня есть модуль python, который разделяется между несколькими моими проектами (проекты имеют разные рабочие каталоги). Одна из функций этого общего модуля выполняет скрипт с использованием os.spawn. Проблема в том, что я не уверен, какой путь указывать на os.spawn, так как я не знаю, как будет работать текущий рабочий каталог при вызове функции. Как я могу ссылаться на файл таким образом, чтобы любой вызывающий абонент мог его найти? Благодаря!Определение имени пути файла из разных рабочих каталогов в python
ответ
Так что я только что узнал о переменной __file__
, которая обеспечит решение моей проблемы. Я могу использовать файл, чтобы получить имя пути, которое будет постоянным среди всех проектов, и использовать его для ссылки на сценарий, который мне нужно вызвать, поскольку сценарий всегда будет находиться в том же месте относительно __file__
. Тем не менее, я открыт для других/лучших методов, если у кого их есть.
Поместите его в известную директорию (/ usr/lib/yourproject/or ~/lib или что-то подобное) или используйте ее в известном относительном пути, основанном на местоположении ваших исходных файлов, которые его используют.
Следующий фрагмент кода будет найти местоположение вызывающего модуль, который имеет смысл с точки программиста зрения:
## 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, если он существует.
Возможно, вы найдете материалы в этой презентации PyCon 2010 по адресу cross platform application development and distribution. Одна из проблем, которые они решают, заключается в постоянном поиске файлов данных на разных платформах, а также для установленных версий проверки разработки кода.
- 1. Как сделать тесты модулей python всегда искать файлы тестовых данных при запуске из разных рабочих каталогов?
- 2. Извлечение имени файла из пути
- 3. Отдельного имени файла из пути
- 4. Получение пути к файлу из имени файла в java
- 5. Пути из массива дерева каталогов
- 6. Список каталогов по определенному пути в Python
- 7. несколько рабочих каталогов в R
- 8. Python: определение имени модуля из функции C
- 9. Получение имени файла/пути из плагинов MvvmCross.DownloadCache
- 10. Извлечь часть имени файла из пути
- 11. XSL - Удаление имени файла из строки пути
- 12. Извлечение имени файла из пути к каталогу
- 13. AWK: Извлечение имени файла из полного пути
- 14. Получение только имени файла из полного пути
- 15. Открытие файла с пути, не зная полного имени файла (python)
- 16. Python - определение глобального имени datetime
- 17. Определение имени файла шрифта TTF
- 18. Импорт из разных каталогов в питона
- 19. Зачистка каталога и имени файла из пути в виде строки
- 20. GITHUB Нажатие файлов из разных каталогов
- 21. Структура каталогов Unix: управление конфликтом имени файла
- 22. Импорт модулей из разных каталогов
- 23. определение пути для файла в FORTRAN
- 24. Поиск пути без имени файла
- 25. ASP.NET MVC Определение типа mime по пути файла/файла
- 26. Python Импорт из общих каталогов
- 27. Groovy - печать каталогов в пути
- 28. Определение имени файла для переменной в Excel
- 29. Поиск пути и имени файла из файла и его печать
- 30. Определение правильного пути включения
Вы имеете в виду «__file__», разметка SO делает его жирным. –
Вы можете изменить __file__ на '__file__', поместив обратные элементы (') вокруг строки. В редакторе есть кнопка (она выглядит как «101 \ n010»), чтобы сделать то же самое. – unutbu
Обычно лучше использовать 'os.path.abspath (__ file __)', чтобы получить полный путь к модулю, чтобы любые последующие изменения в CWD не нарушали его. – bobince