【问题标题】:how to check a file if you don't know his path?如果您不知道他的路径,如何检查文件?
【发布时间】:2016-12-16 15:34:12
【问题描述】:

我有一个文件并像命令一样启动它(没有完整路径):

os.system('start rvpush')

os.system('start rvpush.exe')

两者都启动记事本。但是,如果我删除该文件,它将停止工作并产生错误。一切都是合乎逻辑的......

这是个问题。在开始之前,我需要检查文件是否存在。但我不知道文件存储在哪里。

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

return: False...但是文件存在并已启动...

我尝试从os.environ['PATH'] 获取文件夹,但在这些文件夹中找不到该文件...

我很困惑。该文件启动并工作,但在PATH 环境中没有文件路径...如果您不知道他的路径如何检查文件?

PS:任务是检查文件是否存在,然后运行。我不确定所有计算机都有这个文件,应该在开始之前检查。所以我不确定文件是否在同一个地方,所以只作为命令使用,而不是通过完整路径。除了电脑可以是windows或者linux...

PSS:光盘有很多文件夹,因此只检查整个磁盘以查找文件的选项不合适(可能需要很长时间)。

【问题讨论】:

  • 你需要多操作系统兼容吗? rvpush.exe 看起来像是来自 RV 的调整软件。它通常会安装到 "C:\Program Files (x86)" 文件夹(搜索空间比整个磁盘小得多)
  • 我知道我的计算机上安装了 rvpush.exe 的位置。而且您还没有猜到路径...)我的路径是:C:\ Program Files \ Shotgun \ RV-7.1.1 \ bin \ rvpush.exe - 我使用shotgun的版本。但其他用户可以使用独立版本。以及另一个更改默认位置或其他内容...例如,我还在文件夹名称中列出了一个版本号...我不想关心 rv 的用户路径...如果它在系统中注册,我想启动它简单的命令...

标签: python file search directory system


【解决方案1】:
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

【讨论】:

  • 这是个问题。我不想用黑窗和系统错误消息吓唬用户)我搜索安静版本的检查
【解决方案2】:

回到我最初的评论.. 任何给定终端找到要运行的给定二进制文件的方式是从 PATH 变量开始,然后递归查看路径中每个文件夹中的每个文件..(在 *nix这通常包括 \bin 和 \usr\bin 等。)这与预先定义一些可能的位置并彻底检查所有文件以查看它是否存在没有什么不同。许多程序会在安装时将自己添加到路径中,以便系统能够找到它们,但如果您只有一个随机可执行二进制文件位于任何旧文件夹中。除了彻底检查之外,没有其他方法可以找到它。

也就是说,彻底检查可能没有您想象的那么糟糕。通过一些合理的检查和平衡,您可能会在相对较短的时间内列举出所有可能的地方。 Python 相当慢,我能够在大约 6 秒内枚举我的程序文件和程序文件 (x86) 文件夹中的近 30K 文件名..

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')
在 6.16199994087 秒内找到 29301 个文件的 633 个可执行文件

我只测试了这一种方法,可以想象您可以找到一种更快的方法来一次获取所有文件名,然后可能使用正则表达式来查找您要查找的内容。此外,我会将位置保存在某种配置文件中以供将来查找。在安装期间进行初始搜索,并提供某种加载/安装动画来安抚用户。

【讨论】:

  • 我花了 63 秒。它太长了。我不能强迫用户等待脚本运行几秒钟((
  • 老实说,程序要求用户自己定位插件的情况并不少见(即:大胆地定位 lame 和 ffmpeg),63 秒听起来像你有过多的文件或其他东西您的存储介质有问题.. 对于只应该发生一次的事情,5-10 秒应该不会太糟糕。此外,如果您使用的是 python 3.x,您应该查看this 的速度 os.walk
猜你喜欢
  • 2011-11-03
  • 2019-10-14
  • 2016-01-22
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多