2014-12-11 6 views
0

У меня есть сценарий под названием «test.py» и относится к конфигурационному файлу с именем «cfg.yaml». Эти два находятся в том же каталоге, что и «test/scripts».Смутно об использовании относительного и абсолютного пути в Python

test/scripts/test.py 
test/script/cfg.yaml 

Сейчас я пишу Баш скрипт внутри «тест/data1/data2» под названием task.sh

Изнутри task.sh, я хочу, чтобы сделать вызов питона сценария

test.sh содержимое, как показано ниже:

#!/bin/sh 

python ../../scripts/test.py 

test.py открывает и читает cfg.yaml как открытое ("cfg.yaml"), но когда test.sh называется, он терпит неудачу, потому что «CFG. ямл "не упоминается с относительным па е. Как это разрешить?

+0

1. вы можете запустить test.py из теста/скриптов, 2. внутри test.py вы можете изменить путь к cfg-файлу как «../../scripts/test.py» или 3. вы можете использовать абсолютный путь для файла cfg.Это происходит потому, что интерпретатор python вызывается из test/data1/data2 – rivu

+0

Относительные пути относятся к текущему рабочему каталогу, а не по отношению к местоположению исполняемого файла. – mehtunguh

ответ

0

попробовать

#!/bin/sh 

cd ../../scripts 
python test.py 

Я предполагаю, что в test.py вы ссылаетесь на YAML с локальным путем, который ожидает сценарий должны быть запущен из каталога скриптов (не из data1/data2)

как в стороне вы всегда можете указать print os.getcwd(), чтобы увидеть, что ваш рабочий каталог при запуске скрипта python (или просто pwd in bash)

+0

Мне нравится ваше решение лучше всего! Спасибо, Джоран. Я не знал, что могу выполнять скрипты Python непосредственно из сценария bash. Он работает нормально. – user2921139

0

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

Обычным быстро & грязный раствор, чтобы получить путь к скрипту в явном виде:

import os 
import sys 

scriptdir = os.path.abspath(os.path.dirname(sys.argv[0])) 

Это sys.argv[0] полное имя вашего скрипта-который на большинстве платформ означает либо абсолютный путь, или относительный путь это по крайней мере до сих пор действует на данный момент. Если вас беспокоят эти другие платформы, вы можете посмотреть на __file__. Конечно, если вы запускаете скрипт из zipfile или аналогичного, ни один из них не будет полезен.

open(os.path.join(scriptdir, "cfg.yaml")) 

(Или вы можете даже принудительно os.chdir(scriptdir), если вы хотите, но это может быть плохой идеей, если вы, например, принимая имена путей от пользователя.)

Решение право является для записи ваших файлов сценариев и данных должно быть установлено (даже если вы на самом деле ничего не устанавливаете и не запускаете его из исходного дерева), а затем используйте pkg_resources для поиска файлов данных. Это также решит для вас множество других проблем, но сначала требуется немного больше обучения. См. Python Packaging User Guide, если вы хотите начать работу по этой дороге, и Package Data and Data Files в качестве конкретных отправных точек.

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