2016-12-16 3 views
0

У меня есть файл и запустить его как команду (без полного пути):как проверить файл, если вы не знаете его пути?

os.system('start rvpush') 

или

os.system('start rvpush.exe') 

Оба начинают блокнота. Но если я удалю файл, он перестанет работать и создаст ошибку. Все логично ...

Это проблема. Прежде чем начать, мне нужно проверить, существует ли файл или нет. Но я не знаю, где хранится файл.

os.path.exists('rvpush.exe') 

возвращение: Ложные ... но файл существует и начал ...

Я пытаюсь получить папки из os.environ['PATH'], но файл не найден в этих папках ...

Я м запутался. Файл начался и работал, но в среде PATH нет пути к файлу ... Как проверить файл, если вы не знаете его пути?

PS: Задача состоит в том, чтобы проверить, существует ли файл, а затем запустить его. Я не уверен, что все компьютеры имеют этот файл и должны быть проверены перед запуском. Поэтому я не уверен, что файл находится в одном месте, поэтому используйте его как команду, а не через полный путь. В дополнение к компьютеру могут быть окна или linux ...

PSS: диск имеет много папок, так что возможность просто проверять весь диск в поисках файла не подходит (это может занять очень много времени время).

+0

Вам нужна множественная совместимость с os? 'rvpush.exe' выглядит как из RV с помощью программного обеспечения tweak .., которое будет устанавливаться обычно в папку' 'C: \ Program Files (x86)' '(значительно меньшее пространство для поиска, чем весь диск) – Aaron

+0

я знаю, где на моем установлен компьютер rvpush.exe.и вы не догадались, путь ...) мой путь: C: \ Program Files \ Shotgun \ RV-7.1.1 \ bin \ rvpush.exe - я использую версию из дробовика. но другие пользователи могут использовать автономную версию. и другое изменение местоположения по умолчанию или что-то еще ... например, у меня есть номер версии, указанный в имени папки ... я не хочу заботиться о пользовательском пути rv ... я хочу запустить его, если он зарегистрирован в системе как простая команда ... – MaxKu

ответ

0
try: 
    os.system('start rvpush.exe') 
except IOError as e: 
    # log the error somehow, e.g. logging.warning(e) 
    # do whatever you need to do here if the file doesn't exist 
+0

у нее есть другая проблема: https://s29.postimg.org/krcxpswdz/Capture.png – MaxKu

+0

проблема. я не хочу пугать пользователей черными окнами и сообщениями об ошибках из системы). Я ищу тихую версию проверки – MaxKu

0

обратно в мой первоначальный комментарий .. Кстати любой данный терминал будет найти данный бинарный файл для запуска, чтобы начать с переменной PATH, и рекурсивно смотреть на каждый файл в каждой папке на пути .. (в * nix это обычно включает \ bin и \ usr \ bin и т. д.), это ничем не отличается от предварительного определения некоторых вероятных мест для поиска и исчерпывающей проверки всех файлов, чтобы увидеть, есть ли там. многие программы добавят себя к пути во время установки, чтобы система могла их найти, но если у вас просто есть исполняемый исполняемый файл в любой старой папке. нет способа найти его, кроме исчерпывающей проверки.

Это говорит о том, что исчерпывающая проверка может быть не такой уж плохой, как вы думаете. С некоторыми разумными проверками и противовесами вы можете, вероятно, перечислить все вероятные места за относительно небольшое время. Python является довольно медленно, и я был в состоянии перечислить почти 30К имена файлов в обоих моих программных файлов и файлов программы (x86) папки примерно 6 секунд ..

import os 
from time import time 

t = time() 

executables = 0 
total = 0 
for root, dirs, files in os.walk('C:/Program Files/'): 
    total += len(files) 
    executables += sum(file.endswith('.exe') for file in files) 

for root, dirs, files in os.walk('C:/Program Files (x86)/'): 
    total += len(files) 
    executables += sum(file.endswith('.exe') for file in files) 

print 'found {} executables of {} files in {} seconds'.format(executables, total, time()-t)

печатает:

>>>runfile('C:/Users/**/untitled0.py', wdir='C:/Users/**/python/test') 
found 633 executables of 29301 files in 6.16199994087 seconds

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

+0

мне потребовалось 63 секунды. это очень долго. Я не могу заставить пользователей ждать минуту для скрипта, который затем запускается через несколько секунд (( – MaxKu

+0

). Честно говоря, это не так уж необычно для программ, чтобы попросить пользователя найти сами плагины (то есть: найти хромоту и ffmpeg в смелости), также 63 секунды звучат так, как будто у вас слишком много файлов или что-то не так с вашим носителем. Для чего-то, что только должно было произойти один раз, 5-10 секунд не должно быть слишком плохо. Также, если вы используете python 3 .x вы должны взглянуть на [это] (https://www.python.org/dev/peps/pep-0471/) на скорость 'os.walk' – Aaron

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