如何处理不存在的路径?

时间:2017-04-06 09:33:40

标签: python python-3.x

我有一个创建“Test”对象的类 - 一个基于(描述)外部测试脚本的对象。

可以在此处找到代码:https://codeshare.io/5zlW0W

我像这样使用这个类:

from test import Test

test = Test("/path/to/test")

当测试文件存在时,这非常有效,但是当它不存在时我遇到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/repos/test.py", line 13, in __init__
    self.version = self.get_attribute("version")
  File "/home/user/repos/test.py", line 33, in get_attribute
    p = subprocess.Popen([self.path, '--' + attribute], stdout=subprocess.PIPE, universal_newlines=True)
  File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'bla'

所以我的问题分为两部分:

  1. 处理路径不存在的情况的最佳方法是什么?
  2. 我是否可以使用函数来定义初始变量来抓取数据,就像我在__init__中所做的那样?

2 个答案:

答案 0 :(得分:3)

使用get_attribute

检查os.path.exists(file_path)方法中存在的文件
def get_attribute(self, attribute):
        """Return a given attribute of the test.

        Runs a test subprocess with the --<attribute> argument.
        """
        if os.path.exists(self.path):
            p = subprocess.Popen([self.path, '--' + attribute], stdout=subprocess.PIPE, universal_newlines=True)
                attr = p.stdout.read().strip("\n")

            return attr

答案 1 :(得分:0)

您始终可以使用标准操作系统库。

import os
from test import Test

if os.path.exists("/path/to/test"):
    test = Test("/path/to/test")

如果您还希望确保文件不为空,则可以使用

if os.stat("/path/to/test").st_size > 0:

注意这可能会导致竞争条件:

关于此事的一个好问题可以在这里找到: How does using the try statement avoid a race condition?