Ответ 1
Вам нужно вызвать os.path.realpath
на __file__
, так что, когда __file__
является именем файла без пути, вы все равно получаете путь к dir:
import os
print(os.path.dirname(os.path.realpath(__file__)))
Рассмотрим следующий код Python:
import os
print os.getcwd()
Я использую os.getcwd()
для получить расположение каталога script. Когда я запускаю script из командной строки, он дает мне правильный путь, тогда как когда я запускаю его из script, запускаемого кодом в представлении Django, он печатает /
.
Как я могу получить путь к script из script, запущенного представлением Django?
UPDATE:
Подводя ответы до сих пор - os.getcwd()
и os.path.abspath()
оба предоставляют текущий рабочий каталог, который может быть или не быть каталогом, в котором находится script. В настройках моего веб-хоста
указывается только имя файла без пути.__file__
Нет ли способа в Python (всегда) иметь возможность получить путь, в котором находится script?
Вам нужно вызвать os.path.realpath
на __file__
, так что, когда __file__
является именем файла без пути, вы все равно получаете путь к dir:
import os
print(os.path.dirname(os.path.realpath(__file__)))
Я использую:
import os
import sys
def get_script_path():
return os.path.dirname(os.path.realpath(sys.argv[0]))
Как отмечает айхам в комментарии, вы можете определить эту функцию в модуле и использовать ее в разных сценариях.
Попробуйте sys.path[0]
.
Для цитирования из документов Python:
Как инициализировано при запуске программы, первым элементом этого списка
path[0]
является каталог, содержащий script, который использовался для вызова интерпретатора Python. Если каталог script недоступен (например, если интерпретатор вызывается интерактивно или если script считывается со стандартного ввода),path[0]
- это пустая строка, которая направляет Python на поиск модулей в текущем каталоге. Обратите внимание, что каталог script вставлен перед вставками в результатеPYTHONPATH
.
Этот код:
import os
dn = os.path.dirname(os.path.realpath(__file__))
устанавливает "dn" в имя каталога, содержащего текущий исполняемый script. Этот код:
fn = os.path.join(dn,"vcb.init")
fp = open(fn,"r")
устанавливает "fn" в "script_dir/vcb.init" (независимо от платформы) и открывается этот файл для чтения выполняемым в настоящее время script.
Обратите внимание, что "выполняемый в настоящее время script" несколько неоднозначен. Если вся ваша программа состоит из 1 script, тогда выполняемое в настоящее время решение script и "sys.path [0]" отлично работает. Но если ваше приложение состоит из script A, которое импортирует некоторый пакет "P", а затем вызывает script "B", тогда выполняется "P.B". Если вам нужно получить каталог, содержащий "P.B", вам нужно "os.path.realpath(__file__)
".
"__file__
" просто дает имя текущего исполняемого файла (top-of-stack) script: "x.py". Это не
предоставить любую информацию о пути. Это вызов "os.path.realpath", который выполняет реальную работу.
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
Это сработало для меня (и я нашел его через fooobar.com/questions/15621/...)
os.path.realpath(__file__)
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
Используйте os.path.abspath('')
Это довольно старый поток, но у меня возникла эта проблема при попытке сохранить файлы в текущем каталоге script при запуске python script из задания cron. getcwd(), и многие другие пути приходят с вашим домашним каталогом.
чтобы получить абсолютный путь к используемому script i
directory = os.path.abspath(os.path.dirname(__file__))
Вот что у меня получилось. Это работает для меня, если я импортирую свой script в интерпретаторе, а также если я его выполнил как script:
import os
import sys
# Returns the directory the current script (or interpreter) is running in
def get_script_directory():
path = os.path.realpath(sys.argv[0])
if os.path.isdir(path):
return path
else:
return os.path.dirname(path)
Попробуйте следующее:
def get_script_path(for_file = None):
path = os.path.dirname(os.path.realpath(sys.argv[0] or 'something'))
return path if not for_file else os.path.join(path, for_file)
import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]