Простой ответ: Вы определяете абсолютный путь, основанный на окружающей среде.
Что вам действительно нужно, так это несколько указателей. Существуют различные фрагменты информации о среде выполнения и среде, которые вы можете найти в разных местах стандартной библиотеки (и они, безусловно, помогают мне, когда я хочу развернуть приложение в Windows).
Итак, сначала несколько общих вещей:
os.path
- стандартный библиотечный модуль с большим количеством кроссплатформенных манипуляций с путями. Твой лучший друг. «Следуй за os.path», который я однажды прочитал в книге.
__file__
- расположение текущего модуля.
sys.executable
- Местоположение работающего Python.
Теперь вы можете довольно много почерпнуть из этих трех источников все, что захотите. Функции из os.path помогут вам обойти дерево:
os.path.join('path1', 'path2')
- объединить сегменты пути кроссплатформенным способом
os.path.expanduser('a_path')
- найти путь a_path
в домашнем каталоге пользователя
os.path.abspath('a_path')
- преобразовать относительный путь в абсолютный
os.path.dirname('a_path')
- получить каталог, в котором находится путь
- много много еще ...
Таким образом, комбинируя это, например:
# script1.py
# Get the path to the script2.py in the same directory
import os
this_script_path = os.path.abspath(__file__)
this_dir_path = os.path.dirname(this_script_path)
script2_path = os.path.join(this_dir_path, 'script2.py')
print script2_path
И запустить его:
ali@work:~/tmp$ python script1.py
/home/ali/tmp/script2.py
Теперь для вашего конкретного случая кажется, что вы немного запутались между понятием «рабочий каталог» и «каталог, в котором находится скрипт». Они могут быть одинаковыми, но они также могут быть разными. Например, «рабочий каталог» может быть изменен, и поэтому функции, которые его используют, могут иногда находить то, что ищут, но не другие. subprocess.Popen
является примером этого.
Если вы всегда передаете пути абсолютно, вы никогда не попадете в проблемы с рабочим каталогом.