У меня странная проблема, которую я не совсем понимаю, как ее решить. У меня есть сценарий Python-selenium, который использует относительные пути для записи результатов в текстовый файл.

Вот часть скрипта, которая устанавливает лог-файл:

log_file = './demo-logfiles/log_file_template.txt'
sys.stdout = open('log_file_template.txt', 'a',)

Как видите, он использует относительный путь к папке. Если я запускаю этот скрипт как: python demo.py firefox MAC, он работает безупречно, и файл журнала отправляется в соответствующую папку.

Если я запускаю этот точный скрипт Python из более крупного сценария оболочки, он возвращает ошибку, что './demo-logfiles/log_file_template.txt' не существует.

Я обнаружил, что если я изменю сценарий на '../demo-logfiles/log_file_template.txt', он будет работать в более крупном сценарии оболочки, но перестанет работать, если я запустлю его нормально.

Это либо работает в одном, либо в другом. В чем причина того, что относительные каталоги интерпретируются по-разному? Я не хотел бы иметь два отдельных скрипта для запуска в Python / shell.

Оригинальный скрипт Python находится в каталоге /blah/blah/DEMO/demo.py, а скрипт оболочки, который его запускает, находится в /blah/blah/DEMO/demo-autotest/autotest_logger.sh

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

Спасибо.

0
kplus 23 Янв 2013 в 19:02

2 ответа

Лучший ответ

Вы никогда не должны использовать «.» (или любой относительный путь) в пути к каталогу в сценарии, если вы действительно не имеете в виду, что хотите сослаться на каталог, из которого пользователь запускает сценарий. Если вы хотите сослаться на местоположение относительно выполняемого скрипта, вы можете сделать следующее:

import os
import sys
directory = os.path.dirname(os.path.abspath(__file__))
sys.stdout = open(os.path.join(directory, "demo-logfiles", "log_file_template.txt"), "a")

Замечание по рекомендациям: вам, вероятно, следует использовать модуль logging, а не переназначать sys.stdout.

3
Daisy Sophia Hollman 23 Янв 2013 в 15:34

Термин «относительные каталоги» означает путь относительно чего-либо. Вы, вероятно, предполагаете, что это относительно сценария, который содержит путь, но это не правильно.

Относительные пути относятся к текущему каталогу процесса, который интерпретирует скрипт, то есть к папке, в которой вы запустили python. Если вы находитесь в оболочке, вы можете увидеть текущий каталог с echo $PWD

Если вы запустите python в /blah/blah, он станет текущим каталогом, и все относительные пути будут относительными к /blah/blah.

См. ответ Дэвида Холлмана о том, как получить путь к текущему сценарию, а затем о том, как построить пути относительно этого.

2
Community 23 Май 2017 в 12:12