2011-02-08 2 views
325

Рассмотрим следующий код Python:Как найти каталог скриптов с Python?

import os 
print os.getcwd() 

Я использую os.getcwd() для get the script file's directory location. Когда я запускаю скрипт из командной строки, он дает мне правильный путь, тогда как когда я запускаю его из сценария, запускаемого кодом в представлении Django, он печатает /.

Как я могу получить путь к скрипту из сценария, запускаемого представлением Django?

UPDATE:
Суммируя ответы до сих пор - os.getcwd() и os.path.abspath() оба дают текущий рабочий каталог, который может или не может быть каталог, в котором скрипт находится. В настройках моего веб-хоста __file__ дает только имя файла без пути.

Нет ли способа в Python (всегда) иметь возможность получить путь, в котором находится скрипт?

+1

Вы должны прочитать эту статью, связанную более внимательно. Он никогда не предполагает, что использование 'getcwd' скажет вам местоположение вашего сценария. Он предлагает 'argv [0]', 'dirname' и' abspath'. –

+0

@Rob - «print sys.argv [0]» на моем веб-хосте только дает имя файла, без пути – Jonathan

+0

@Rob - вот выдержка из связанной статьи «os.getcwd() возвращает текущий рабочий каталог». – Jonathan

ответ

510

Вам нужно вызвать os.path.realpath на __file__, так что, когда __file__ это имя файла без пути вы все равно получите путь реж:

import os 
print(os.path.dirname(os.path.realpath(__file__))) 
+30

Это не сработает, если вы используете внутри интерпретатора, так как вы получите 'NameError: name '__file__' не определено' –

+0

@EhteshChoudhury Что вы имеете в виду путем «запуска изнутри интерпретатора» –

+2

Попробуйте запустить 'python -c 'import os; print os.path.dirname (os.path.realpath (__ file __)) '', который представляет собой набор команд, выполняемых интерпретатором python. –

3

Использование os.path.abspath('')

+0

Это работает для всего, что находится на моей машине dev, но только для файлов сценариев на моем веб-хосте. Это не работает для settings.py, например. следующее не работает: TEMPLATE_DIRS = ((os.path.abspath ('') + '/ templates'),) – Jonathan

12
import os,sys 
# Store current working directory 
pwd = os.path.dirname(__file__) 
# Append current directory to the python path 
sys.path.append(pwd) 
+0

Это отлично работает на моей машине dev, но не работает на моем веб-хостинге - я получаю '/ ' – Jonathan

+0

Нечетный, у вас есть доступ к файлам apache conf? Или это сервер Windows? – jbcurtin

104

Я использую:

import os 
import sys 

def get_script_path(): 
    return os.path.dirname(os.path.realpath(sys.argv[0])) 

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

+9

+1 потому что полезный атрибут модуля '__file__' не всегда определен. – iacopo

+4

Это также полезно, если вы хотите поместить getScriptPath() в другой модуль, но получите путь к файлу, который был фактически выполнен, а не к пути к модулю. – aiham

+0

@aiham: Хорошая точка. На самом деле эта функция находится в моем модуле utils :) – neuro

91

Пробег: sys.path[0].

Цитирую из документации Python:

As initialized upon program startup, the first item of this list, path[0] , is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH .

Источник: https://docs.python.org/library/sys.html#sys.path

+8

+1 для цитирования документов –

+1

это обычно правильное решение – vidstige

+2

Это правильное решение. – Mike

-1
import os 
exec_filepath = os.path.realpath(__file__) 
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))] 
+1

Почему бы не использовать os.path.dirname? – SpoonMeiser

+0

Я не знал о os.path.dirname, возможно, это тоже работает. – Stan

6
import os 
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep 
+0

Спасибо, мне нужен os.sep: D –

14

Этот код:

import os 
dn = os.path.dirname(os.path.realpath(__file__)) 

наборы «дп» к имени каталога содержащий текущий исполняемый скрипт. Этот код:

fn = os.path.join(dn,"vcb.init") 
fp = open(fn,"r") 

наборы «п» в «script_dir/vcb.init» (в платформе независимым образом) и открывает , что файл для чтения в данный момент скрипта.

Обратите внимание, что «исполняемый скрипт» несколько неоднозначен. Если вся ваша программа состоит из 1 скрипта, то это исполняемый скрипт, а решение «sys.path [0]» отлично работает. Но если ваше приложение состоит из скрипта A, который импортирует некоторый пакет «P», а затем вызывает скрипт «B», тогда «P.B "в настоящее время выполняется. Если вам нужно получить каталог, содержащий« PB », вы хотите получить решение« os.path.realpath(__file__) ».

« __file__ »просто дает имя исполняемого в настоящее время сценария (сверху стека): «x.py» .Она не предоставляет любую информацию о пути. Это вызов «os.path.realpath», который выполняет реальную работу.

2

Это довольно старый поток, но у меня была эта проблема при попытке сохранить файлы в текущем каталоге, в котором выполняется скрипт, при запуске скрипта python из задания cron. getcwd() и много другого пути приходят с вашим домашним каталогом.

, чтобы получить абсолютный путь кскрипт я использовал

directory = os.path.abspath(os.path.dirname(__file__))

2

Вот что я закончил с. Это работает для меня, если я импортировать мой сценарий в интерпретаторе, а также, если я выполнить его как сценарий:

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) 
0

Попробуйте это:

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) 
Смежные вопросы