2012-04-24 2 views
8

Если вы используете замороженный скрипт python (замороженный с помощью py2exe) из каталога и диска, отличного от того, где присутствует скрипт, что является лучшим способом определить путь для выполнение скрипта?Как получить путь к исполняемому замороженному сценарию

Несколько решений я попробовал

inspect.getfile(inspect.currentframe()) 

Проблема: Не возвращает полный путь. Он возвращает только имя сценария.

os.path.abspath(__file__) 

Проблема: Не работает на Windows,

os.path.dirname(sys.argv[0]) 

Проблема: Возвращает пустую строку.

os.path.abspath(inspect.getsourcefile(way3)) 

не будет работать, если привод отличается от PWD

os.path.dirname(os.path.realpath(sys.argv[0])) 

не будет работать, если привод отличается от PWD

Здесь является не минимален -рабочий пример

D:\>path 
PATH=c:\Python27\;c:\Users\abhibhat\Desktop\ToBeRemoved\spam\dist\;c:\gnuwin32\bin 

D:\>cat c:\Users\abhibhat\Desktop\ToBeRemoved\spam\eggs.py 
import os, inspect, sys 
def way1(): 
    return os.path.dirname(sys.argv[0]) 

def way2(): 
    return inspect.getfile(inspect.currentframe()) 

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

def way4(): 
    try: 
     return os.path.abspath(__file__) 
    except NameError: 
     return "Not Found" 
def way5(): 
    return os.path.abspath(inspect.getsourcefile(way3)) 

if __name__ == '__main__': 
    print "Path to this script is",way1() 
    print "Path to this script is",way2() 
    print "Path to this script is",way3() 
    print "Path to this script is",way4() 
    print "Path to this script is",way5() 

D:\>eggs 
Path to this script is 
Path to this script is eggs.py 
Path to this script is D:\ 
Path to this script is Not Found 

Вопросы, относящиеся:

Примечание

@ решение Fenikso будет работать, если сценарий находится на тот же диск, на котором вы выполняете, но когда его на другой диск, он не будет работать

ответ

10

Другой подход, который работает с cxFreeze при работе с другого диска даже при использовании PATH:

import sys 

if hasattr(sys, 'frozen'): 
    print(sys.executable) 
else: 
    print(sys.argv[0]) 

От Python:

H:\Python\Examples\cxfreeze\pwdme.py 

Из командной строки:

D:\>h:\Python\Examples\cxfreeze\dist\pwdme.exe 
h:\Python\Examples\cxfreeze\dist\pwdme.exe 

Использование PATH:

D:\>pwdme.exe 
h:\Python\Examples\cxfreeze\dist\pwdme.exe 
+2

Да, это работает также с py2exe. –

+0

@Fenikso: Это работает отлично. Перед публикацией этого вопроса я видел несколько ссылок на одну и ту же проблему в SO, но ни один из ответов не является правильным как таковой. – Abhijit

0

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

WD = os.path.dirname(os.path.realpath(sys.argv[0])) 

Это то, что я использую с cx_Freeze получить каталог, откуда .exe является действительно работает.

+0

Это не будет работать, если сценарий присутствует в другой привод – Abhijit

+0

@Abhijit - К сожалению, я не понимаю. Это фундаментальная часть всех моих замороженных скриптов, и это никогда не удавалось. Можете ли вы описать пример, когда это не удается? – Fenikso

+0

Я обновил пример, чтобы включить этот сценарий. Если диск отличается, он просто возвращает имя диска, с которого вы работаете. – Abhijit

2

ИМХО, код, который действует по-разному в зависимости от абсолютных путей, не является хорошим решением. Возможно, это будет скорее относительное решение пути. Используйте dirname, чтобы узнать относительный каталог и os.sep для совместимости с кросс-платформой.

if hasattr(sys, "frozen"): 
    main_dir = os.path.dirname(sys.executable) 
    full_real_path = os.path.realpath(sys.executable) 
else: 
    script_dir = os.path.dirname(__file__) 
    main_dir = os.path.dirname(os.path.realpath(sys.argv[0])) 
    full_real_path = os.path.realpath(sys.argv[0]) 

Замедленный атрибут - стандарт python.

Посмотрите также на Esky: http://pypi.python.org/pypi/esky

Смежные вопросы