2016-10-20 4 views
1

У меня есть файл app.py, который импортирует module.py. Мне нужно выяснить путь app.py, например: /home/user/app/app.py, он отлично работает в той же папке, но когда я вызываю app.py из другой папки, а мой текущий каталог /home/user Я получаю свою текущую директорию вместо каталога, где находится app.py.Как модуль может получить путь к файлу, который импортирует его в python?

Это содержимое module.py.

os.getcwd() < - это возвращает мой рабочий путь

< os.path.dirname(__file__) - это возвращает путь модуля

Каков наилучший подход для этого? Я как бы застрял и ничего не нашел в Google об этом.

+1

Вы не просто хотите: 'os.path.dirname (os.path.abspath (__ __) файл' – c4urself

+0

Os?. path.dirname (os.path.abspath (__ file__) <- это все еще дает мне путь к модулю, я хочу, чтобы путь к файлу вызывал модуль! – codesardine

+0

Я забыл упомянуть об этом внутри module.py [os.path. dirname (os.path.abspath (__ file__)] – codesardine

ответ

0

Используйте следующие строки кода в модуле вы импортируете:

Module.py

import inspect 

# Return the frame object for the caller's stack frame. 
frame = inspect.currentframe() 

# Get calling rame from list of all call frames. 
calling_frame = inspect.getouterframes(frame)[1][0] 

#Prints a traceback tuple. 
print inspect.getframeinfo(calling_frame) 

Кроме того, есть еще один хак, который вы можете попробовать. Я не предлагаю его для производства кода, но его просто для удовольствия :):

1. Generate the exception in your module. 
2. Catch it and find the Traceback. 
3. Manipulate the Traceback according to you requirement. 
+0

танков, но это сделало работу для меня выводит правильный путь -> os. path.dirname (os.path.abspath (sys.argv [0])) – codesardine

+0

Это будет работать только тогда, когда вам нужен путь к программе, в которой вы работаете. Пока решение, которое я дал, является своего рода родовым. Если вы найдете это полезным, отметьте как ответ. – Shasha99

+0

il только хочу, чтобы путь к программе я выполнял метку can not, как было указано, если @ c4urself не дает мне ответа вместо комментария – codesardine