[완료] python 에서 실행화일의 path 찾는법.

litdream의 이미지

제가 만든 애플리케이션이 다음과 같은 구조로 되어있을때,

[AppRoot]
  /bin
    +- exe1.py, exe2.py, ...
  /lib
  /etc

가령, 어느 디렉토리에서든지 $ python [AppRoot]/bin/exe1.py 를 불러내더라도, exe1.py 의 위치를 찾아서, AppRoot 를 채워넣을 수 있는 방법이 있을까요? 그래서, lib 과 etc 를 항상 exception 없이 찾고싶습니다.
혹시 이방법말고도, hardcode 하지 않고도 위치를 찾는 좋은 방법있으면 부탁드립니다.

bootmeta의 이미지

dive into python 책 16.2 Finding path

http://www.diveintopython.org/functional_programming/finding_the_path.html

#!/usr/bin/env python
 
import sys, os
 
print 'sys.argv[0] =', sys.argv[0]         
pathname = os.path.dirname(sys.argv[0])
print 'path =', pathname
print 'full path =', os.path.abspath(pathname)
litdream의 이미지

답글 감사합니다.

물론, sys.argv[0] 로 넘겨졌을수도 있겠지만, 만약에 제 프로그램이 /usr/local/ 로 deploy 될 경우, 그리고, /usr/local/bin 이 PATH 에 걸려있을경우는, sys.argv[0] 가 그냥 executable 이 될수도 있겠죠.

물론, 이럴경우는 python 으로 사용한 lib 들이 /usr/local/lib 에 짬뽕이 되어서, 시스템상으로도 보기가 안좋아지기때문에, 무시할수도 있는 문제입니다. 더군다나, deploy 할수 있는 시스템은 모두 제가 제어할수 있기때문에, 항상 argv[0] 를 절대경로로 넘겨주도록 할수 있습니다만... :)

제가 질문을 좀 다르게 표현해보자면,
process image 로 카피된 코드의 원본의 위치를 파악할수 있는 방법이 Python 에 있는가 말이죠.
그냥, 단순히 생각해보면 안될것 같긴한데, 뛰어난 분들이 설계한 코드니깐, 있을것 같기도 하고해서요.. :)

어쨌든, 관심가져주셔서 감사합니다.

삽질의 대마왕...

삽질의 대마왕...

litdream의 이미지

해결했습니다.
bbs.python.or.kr 에서 도움을 받았습니다.
링크를 남깁니다.

http://bbs.python.or.kr/viewtopic.php?t=22792

삽질의 대마왕...

삽질의 대마왕...

bootmeta의 이미지

그런데 링크의 해결 방법

f = sys._getframe(0)
path = f.f_globals['__file__'] 

과 제가 예를 들은
path = sys.argv[0]        

결과가 같습니다.
굳이 복잡한 방법을 쓰지 않아도 될 것 같습니다.
참고로 sys.argv[0]는 실행가능한 script.py를 직접 실행하나 python script.py로 실행하나 결과는 같습니다.
그런데 아무래도 뭔가 아직도 질문을 잘못 이해했을지 모른다는 생각이 얼핏 -_-;
litdream의 이미지

정말 그렇군요.
argv[0], 혹은 sys.module['__main__'].__file__ 등이 frame 에서 받아온값과 같네요.

결국, os.path.abspath() 를 한번 더 붙여줘서 해결했습니다.
저도 급한마음에 테스트를 덜하고는, 잠깐 착각했었습니다.
지적 감사합니다.

삽질의 대마왕...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.