Python os.stat() Examples
The following are 30 code examples for showing how to use os.stat(). These examples are extracted from open source projects. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example.
You may check out the related API usage on the sidebar.
You may also want to check out all available functions/classes of the module
os
, or try the search function
.
Example 1
Project: macops Author: google File: can_haz_image.py License: Apache License 2.0 | 7 votes |
def GetFileChecksum(self, filepath): """Generates checksum of given file. Args: filepath: String of filepath. Returns: f_hash: SHA1 hash for the file provided in filepath. """ statinfo = os.stat(filepath) if statinfo.st_size/1048576 < 200: f_content = open(filepath, 'r').read() f_hash = hashlib.sha1(f_content).hexdigest() return f_hash else: cmd = ['shasum', filepath] (stdout, unused_sterr, unused_rc) = RunProcess(cmd) return stdout.split()[0]
Example 2
Project: delocate Author: matthew-brett File: test_tools.py License: BSD 2-Clause "Simplified" License | 7 votes |
def test_ensure_writable(): # Test ensure writable decorator with InTemporaryDirectory(): with open('test.bin', 'wt') as fobj: fobj.write('A line\n') # Set to user rw, else r os.chmod('test.bin', 0o644) st = os.stat('test.bin') @ensure_writable def foo(fname): pass foo('test.bin') assert_equal(os.stat('test.bin'), st) # No-one can write os.chmod('test.bin', 0o444) st = os.stat('test.bin') foo('test.bin') assert_equal(os.stat('test.bin'), st)
Example 3
Project: cherrypy Author: cherrypy File: test_core.py License: BSD 3-Clause "New" or "Revised" License | 6 votes |
def setup_server(): def break_header(): # Add a header after finalize that is invalid cherrypy.serving.response.header_list.append((2, 3)) cherrypy.tools.break_header = cherrypy.Tool( 'on_end_resource', break_header) class Root: @cherrypy.expose def index(self): return 'hello' @cherrypy.config(**{'tools.break_header.on': True}) def start_response_error(self): return 'salud!' @cherrypy.expose def stat(self, path): with cherrypy.HTTPError.handle(OSError, 404): os.stat(path) root = Root() cherrypy.tree.mount(root)
Example 4
Project: multibootusb Author: mbusb File: _util.py License: GNU General Public License v2.0 | 6 votes |
def get_device_type(filename): """ Get the device type of a device file. ``filename`` is a string containing the path of a device file. Return ``'char'`` if ``filename`` is a character device, or ``'block'`` if ``filename`` is a block device. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 """ mode = os.stat(filename).st_mode if stat.S_ISCHR(mode): return 'char' elif stat.S_ISBLK(mode): return 'block' else: raise ValueError('not a device file: {0!r}'.format(filename))
Example 5
Project: multibootusb Author: mbusb File: usb.py License: GNU General Public License v2.0 | 6 votes |
def is_block(usb_disk): """ Function to detect if the USB is block device :param usb_disk: USB disk path :return: True is devie is block device else False """ import stat if platform.system() == 'Linux': if len(usb_disk) != 9: return False elif platform.system() == 'Windows': if len(usb_disk) != 2: return False else: return True try: mode = os.stat(usb_disk).st_mode gen.log(mode) gen.log(stat.S_ISBLK(mode)) except: return False return stat.S_ISBLK(mode)
Example 6
Project: DOTA_models Author: ringringyi File: download_and_convert_cifar10.py License: Apache License 2.0 | 6 votes |
def _download_and_uncompress_dataset(dataset_dir): """Downloads cifar10 and uncompresses it locally. Args: dataset_dir: The directory where the temporary files are stored. """ filename = _DATA_URL.split('/')[-1] filepath = os.path.join(dataset_dir, filename) if not os.path.exists(filepath): def _progress(count, block_size, total_size): sys.stdout.write('\r>> Downloading %s %.1f%%' % ( filename, float(count * block_size) / float(total_size) * 100.0)) sys.stdout.flush() filepath, _ = urllib.request.urlretrieve(_DATA_URL, filepath, _progress) print() statinfo = os.stat(filepath) print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') tarfile.open(filepath, 'r:gz').extractall(dataset_dir)
Example 7
Project: DOTA_models Author: ringringyi File: dataset_utils.py License: Apache License 2.0 | 6 votes |
def download_and_uncompress_tarball(tarball_url, dataset_dir): """Downloads the `tarball_url` and uncompresses it locally. Args: tarball_url: The URL of a tarball file. dataset_dir: The directory where the temporary files are stored. """ filename = tarball_url.split('/')[-1] filepath = os.path.join(dataset_dir, filename) def _progress(count, block_size, total_size): sys.stdout.write('\r>> Downloading %s %.1f%%' % ( filename, float(count * block_size) / float(total_size) * 100.0)) sys.stdout.flush() filepath, _ = urllib.request.urlretrieve(tarball_url, filepath, _progress) print() statinfo = os.stat(filepath) print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') tarfile.open(filepath, 'r:gz').extractall(dataset_dir)
Example 8
Project: DOTA_models Author: ringringyi File: cifar10.py License: Apache License 2.0 | 6 votes |
def maybe_download_and_extract(): """Download and extract the tarball from Alex's website.""" dest_directory = FLAGS.data_dir if not os.path.exists(dest_directory): os.makedirs(dest_directory) filename = DATA_URL.split('/')[-1] filepath = os.path.join(dest_directory, filename) if not os.path.exists(filepath): def _progress(count, block_size, total_size): sys.stdout.write('\r>> Downloading %s %.1f%%' % (filename, float(count * block_size) / float(total_size) * 100.0)) sys.stdout.flush() filepath, _ = urllib.request.urlretrieve(DATA_URL, filepath, _progress) print() statinfo = os.stat(filepath) print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') extracted_dir_path = os.path.join(dest_directory, 'cifar-10-batches-bin') if not os.path.exists(extracted_dir_path): tarfile.open(filepath, 'r:gz').extractall(dest_directory)
Example 9
Project: delocate Author: matthew-brett File: tools.py License: BSD 2-Clause "Simplified" License | 6 votes |
def ensure_permissions(mode_flags=stat.S_IWUSR): """decorator to ensure a filename has given permissions. If changed, original permissions are restored after the decorated modification. """ def decorator(f): def modify(filename, *args, **kwargs): m = chmod_perms(filename) if exists(filename) else mode_flags if not m & mode_flags: os.chmod(filename, m | mode_flags) try: return f(filename, *args, **kwargs) finally: # restore original permissions if not m & mode_flags: os.chmod(filename, m) return modify return decorator # Open filename, checking for read permission
Example 10
Project: smbprotocol Author: jborean93 File: shutil.py License: MIT License | 6 votes |
def copymode(src, dst, follow_symlinks=True, **kwargs): """ Copy the permission bits from src to dst. The file contents, owner, and group are unaffected. Due to the limitations of Windows, this function only sets/unsets the dst's FILE_ATTRIBUTE_READ_ONLY flag based on what src's attribute is set to. If follow_symlinks is 'False', and both src and dst are symbolic links, copymode() will attempt to modify the mode of dst itself (rather than the file it points to). This function supports src and dst being either a local or UNC path. A relative path will be resolved based on the current working directory. :param src: The src file or directory to copy the read only flag from. :param dst: The dst file or directory to copy the read only flag to. :param follow_symlinks: Whether to copy the read only flag on the symlink or the target of the symlink. :param kwargs: Common arguments used to build the SMB Session for any UNC paths. """ src_mode = stat.S_IMODE(_get_file_stat(src, follow_symlinks, **kwargs).st_mode) norm_dst = ntpath.normpath(dst) if norm_dst.startswith('\\\\'): read_only = not (src_mode & stat.S_IWRITE == stat.S_IWRITE and src_mode & stat.S_IREAD == stat.S_IREAD) _set_file_basic_info(dst, follow_symlinks, read_only=read_only, **kwargs) else: _local_chmod(dst, src_mode, follow_symlinks)
Example 11
Project: smbprotocol Author: jborean93 File: test_smbclient_shutil.py License: MIT License | 6 votes |
def test_copymode_remote_to_local(smb_share, tmpdir): test_dir = tmpdir.mkdir("test") src_filename = "%s\\source.txt" % smb_share dst_filename = "%s\\target.txt" % test_dir with open_file(src_filename, mode='w', file_attributes=FileAttributes.FILE_ATTRIBUTE_READONLY) as fd: fd.write(u"content") with open(dst_filename, mode='w') as fd: fd.write(u"content") copymode(src_filename, dst_filename) actual = os.stat(dst_filename).st_mode assert stat.S_IMODE(actual) & stat.S_IWRITE == 0 remove(src_filename) with open_file(src_filename, mode='w') as fd: fd.write(u"content") copymode(src_filename, dst_filename) actual = os.stat(dst_filename).st_mode assert stat.S_IMODE(actual) & stat.S_IWRITE == stat.S_IWRITE
Example 12
Project: smbprotocol Author: jborean93 File: test_smbclient_shutil.py License: MIT License | 6 votes |
def test_copymode_local_to_local_symlink_dont_follow(tmpdir): test_dir = tmpdir.mkdir('test') src_filename = "%s\\source.txt" % test_dir dst_filename = "%s\\target.txt" % test_dir with open(src_filename, mode='w') as fd: fd.write(u"content") os.chmod(src_filename, stat.S_IREAD) with open(dst_filename, mode='w') as fd: fd.write(u"content") src_link = "%s\\source-link.txt" % test_dir dst_link = "%s\\target-link.txt" % test_dir os.symlink(src_filename, src_link) os.symlink(dst_filename, dst_link) expected = "chmod: follow_symlinks unavailable on this platform" with pytest.raises(NotImplementedError, match=re.escape(expected)): copymode(src_link, dst_link, follow_symlinks=False)
Example 13
Project: smbprotocol Author: jborean93 File: test_smbclient_shutil.py License: MIT License | 6 votes |
def test_copystat_local_to_remote(smb_share, tmpdir): test_dir = tmpdir.mkdir("test") src_filename = "%s\\source.txt" % test_dir dst_filename = "%s\\target.txt" % smb_share with open(src_filename, mode='w') as fd: fd.write(u"content") os.chmod(src_filename, stat.S_IREAD) os.utime(src_filename, (1024, 1024)) with open_file(dst_filename, mode='w') as fd: fd.write(u"content") copystat(src_filename, dst_filename) actual = smbclient_stat(dst_filename) assert actual.st_atime == 1024 assert actual.st_mtime == 1024 assert actual.st_file_attributes & FileAttributes.FILE_ATTRIBUTE_READONLY == FileAttributes.FILE_ATTRIBUTE_READONLY
Example 14
Project: smbprotocol Author: jborean93 File: test_smbclient_shutil.py License: MIT License | 6 votes |
def test_copystat_remote_to_local(smb_share, tmpdir): test_dir = tmpdir.mkdir("test") src_filename = "%s\\source.txt" % smb_share dst_filename = "%s\\target.txt" % test_dir with open_file(src_filename, mode='w', file_attributes=FileAttributes.FILE_ATTRIBUTE_READONLY) as fd: fd.write(u"content") utime(src_filename, times=(1024, 1024)) with open(dst_filename, mode='w') as fd: fd.write(u"content") copystat(src_filename, dst_filename) actual = os.stat(dst_filename) assert actual.st_atime == 1024 assert actual.st_mtime == 1024 assert stat.S_IMODE(actual.st_mode) & stat.S_IWRITE == 0
Example 15
Project: smbprotocol Author: jborean93 File: test_smbclient_shutil.py License: MIT License | 6 votes |
def test_copystat_local_to_local(tmpdir): test_dir = tmpdir.mkdir("test") src_filename = "%s\\source.txt" % test_dir dst_filename = "%s\\target.txt" % test_dir with open(src_filename, mode='w') as fd: fd.write(u"content") os.chmod(src_filename, stat.S_IREAD) os.utime(src_filename, (1024, 1024)) with open(dst_filename, mode='w') as fd: fd.write(u"content") copystat(src_filename, dst_filename) actual = os.stat(dst_filename) assert actual.st_atime == 1024 assert actual.st_mtime == 1024 assert stat.S_IMODE(actual.st_mode) & stat.S_IWRITE == 0
Example 16
Project: smbprotocol Author: jborean93 File: test_smbclient_shutil.py License: MIT License | 6 votes |
def test_copystat_local_to_local_symlink_dont_follow_fail(tmpdir): test_dir = tmpdir.mkdir('test') src_filename = "%s\\source.txt" % test_dir dst_filename = "%s\\target.txt" % test_dir with open(src_filename, mode='w') as fd: fd.write(u"content") os.chmod(src_filename, stat.S_IREAD) with open(dst_filename, mode='w') as fd: fd.write(u"content") src_link = "%s\\source-link.txt" % test_dir dst_link = "%s\\target-link.txt" % test_dir os.symlink(src_filename, src_link) os.symlink(dst_filename, dst_link) expected = "follow_symlinks unavailable on this platform" with pytest.raises(NotImplementedError, match=re.escape(expected)): copystat(src_link, dst_link, follow_symlinks=False)
Example 17
Project: InsightAgent Author: insightfinder File: collectdReportMetrics.py License: Apache License 2.0 | 6 votes |
def remove_old_files(directory, filetype): now = datetime.datetime.now() now_time = now.time() # time between which each day the deletion is done if datetime.time(06, 30) <= now_time <= datetime.time(20, 35): # data directory path data_file_path = directory # data_file_path = os.path.join(homepath,datadir) now = time.time() for f in os.listdir(data_file_path): data_file = os.path.join(data_file_path, f) # check files older than 3 days if os.stat(data_file).st_mtime < now - 2 * 86400: # only delete csv files if filetype is None: if os.path.isfile(data_file): os.remove(data_file) else: if str(filetype) in str(os.path.splitext(data_file)[1]): # print data_file if os.path.isfile(data_file): os.remove(data_file)
Example 18
Project: InsightAgent Author: insightfinder File: runSysTrace.py License: Apache License 2.0 | 6 votes |
def updateFile(filepath, filename, newSession): global homepath file = os.path.join(homepath,filepath,filename) oldSession = "null" currentSession = "null" if (os.stat(file).st_size == 0): open(os.path.join(file), 'a+').writelines(newSession+"\n") else: lines = open(file).readlines() if len(lines) == 1: currentSession = lines[0].rstrip('\n') lines.append(newSession+'\n') open(os.path.join(file), 'w+').writelines(lines[0:]) else: lines.append(newSession+'\n') oldSession = lines[0].rstrip('\n') currentSession = lines[1].rstrip('\n') open(os.path.join(file), 'w+').writelines(lines[1:]) return oldSession, currentSession
Example 19
Project: fine-lm Author: akzaidi File: generator_utils.py License: MIT License | 6 votes |
def gunzip_file(gz_path, new_path): """Unzips from gz_path into new_path. Args: gz_path: path to the zipped file. new_path: path to where the file will be unzipped. """ if tf.gfile.Exists(new_path): tf.logging.info("File %s already exists, skipping unpacking" % new_path) return tf.logging.info("Unpacking %s to %s" % (gz_path, new_path)) # We may be unpacking into a newly created directory, add write mode. mode = stat.S_IRWXU or stat.S_IXGRP or stat.S_IRGRP or stat.S_IROTH os.chmod(os.path.dirname(new_path), mode) with gzip.open(gz_path, "rb") as gz_file: with tf.gfile.GFile(new_path, mode="wb") as new_file: for line in gz_file: new_file.write(line)
Example 20
Project: ANGRYsearch Author: DoTheEvo File: scandir.py License: GNU General Public License v2.0 | 6 votes |
def stat(self, follow_symlinks=True): if follow_symlinks: if self._stat is None: if self.is_symlink(): # It's a symlink, call link-following stat() self._stat = stat(self.path) else: # Not a symlink, stat is same as lstat value if self._lstat is None: self._lstat = find_data_to_stat(self._find_data) self._stat = self._lstat return self._stat else: if self._lstat is None: # Lazily convert to stat object, because it's slow # in Python, and often we only need is_dir() etc self._lstat = find_data_to_stat(self._find_data) return self._lstat
Example 21
Project: MicroWebSrv2 Author: jczic File: httpResponse.py License: MIT License | 6 votes |
def ReturnFile(self, filename, attachmentName=None) : if not isinstance(filename, str) or len(filename) == 0 : raise ValueError('"filename" must be a not empty string.') if attachmentName is not None and not isinstance(attachmentName, str) : raise ValueError('"attachmentName" must be a string or None.') try : size = stat(filename)[6] except : self.ReturnNotFound() return try : file = open(filename, 'rb') except : self.ReturnForbidden() return if attachmentName : cd = 'attachment; filename="%s"' % attachmentName.replace('"', "'") self.SetHeader('Content-Disposition', cd) if not self._contentType : self._contentType = self._mws2.GetMimeTypeFromFilename(filename) self._contentLength = size self.ReturnStream(200, file) # ------------------------------------------------------------------------
Example 22
Project: certidude Author: laurivosandi File: authority.py License: MIT License | 6 votes |
def get_revoked(serial): if isinstance(serial, str): serial = int(serial, 16) path = os.path.join(config.REVOKED_DIR, "%040x.pem" % serial) with open(path, "rb") as fh: buf = fh.read() header, _, der_bytes = pem.unarmor(buf) cert = x509.Certificate.load(der_bytes) try: reason = getxattr(path, "user.revocation.reason").decode("ascii") except IOError: # TODO: make sure it's not required reason = "key_compromise" return path, buf, cert, \ cert["tbs_certificate"]["validity"]["not_before"].native.replace(tzinfo=None), \ cert["tbs_certificate"]["validity"]["not_after"].native.replace(tzinfo=None), \ datetime.utcfromtimestamp(os.stat(path).st_ctime), \ reason
Example 23
Project: godot-mono-builds Author: godotengine File: os_utils.py License: MIT License | 5 votes |
def chmod_plus_x(file): import os import stat umask = os.umask(0) os.umask(umask) st = os.stat(file) os.chmod(file, st.st_mode | ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & ~umask))
Example 24
Project: aegea Author: kislyuk File: ssh.py License: Apache License 2.0 | 5 votes |
def ensure_bless_ssh_cert(ssh_key_name, bless_config, use_kms_auth, max_cert_age=1800): ssh_key = ensure_local_ssh_key(ssh_key_name) ssh_key_filename = get_ssh_key_path(ssh_key_name) ssh_cert_filename = ssh_key_filename + "-cert.pub" if os.path.exists(ssh_cert_filename) and time.time() - os.stat(ssh_cert_filename).st_mtime < max_cert_age: logger.info("Using cached Bless SSH certificate %s", ssh_cert_filename) return ssh_cert_filename logger.info("Requesting new Bless SSH certificate") for lambda_regional_config in bless_config["lambda_config"]["regions"]: if lambda_regional_config["aws_region"] == clients.ec2.meta.region_name: break session = boto3.Session(profile_name=bless_config["client_config"]["aws_user_profile"]) iam = session.resource("iam") sts = session.client("sts") assume_role_res = sts.assume_role(RoleArn=bless_config["lambda_config"]["role_arn"], RoleSessionName=__name__) awslambda = boto3.client('lambda', region_name=lambda_regional_config["aws_region"], aws_access_key_id=assume_role_res['Credentials']['AccessKeyId'], aws_secret_access_key=assume_role_res['Credentials']['SecretAccessKey'], aws_session_token=assume_role_res['Credentials']['SessionToken']) bless_input = dict(bastion_user=iam.CurrentUser().user_name, bastion_user_ip="0.0.0.0/0", bastion_ips=",".join(bless_config["client_config"]["bastion_ips"]), remote_usernames=",".join(bless_config["client_config"]["remote_users"]), public_key_to_sign=get_public_key_from_pair(ssh_key), command="*") if use_kms_auth: bless_input["kmsauth_token"] = get_kms_auth_token(session=session, bless_config=bless_config, lambda_regional_config=lambda_regional_config) res = awslambda.invoke(FunctionName=bless_config["lambda_config"]["function_name"], Payload=json.dumps(bless_input)) bless_output = json.loads(res["Payload"].read().decode()) if "certificate" not in bless_output: raise AegeaException("Error while requesting Bless SSH certificate: {}".format(bless_output)) with open(ssh_cert_filename, "w") as fh: fh.write(bless_output["certificate"]) return ssh_cert_filename
Example 25
Project: aegea Author: kislyuk File: cloudinit.py License: Apache License 2.0 | 5 votes |
def add_file_to_cloudinit_manifest(src_path, path, manifest): with open(src_path, "rb") as fh: content = fh.read() manifest[path] = dict(path=path, permissions='0' + oct(os.stat(src_path).st_mode)[-3:]) try: manifest[path].update(content=content.decode()) except UnicodeDecodeError: manifest[path].update(content=base64.b64encode(gzip_compress_bytes(content)), encoding="gz+b64")
Example 26
Project: ALF Author: blackberry File: SockPuppet.py License: Apache License 2.0 | 5 votes |
def send_file(self, src, dst=None): if not os.path.isfile(src): raise RuntimeError("%s does not exist!" % src) if dst is None: dst = os.path.basename(src) log.debug("sending file (%s) -> (%s)", src, dst) file_size = int(os.stat(src).st_size) chksum = 0 with open(src, "rb") as fp: while fp.tell() < file_size: chksum = zlib.adler32(fp.read(self.CHUNK_BUF), chksum) data = { "cmd":self.FILE, "name":os.path.basename(dst), "path":os.path.dirname(dst), "size":file_size, "chksum":chksum } self.send_data(data) with open(src, "rb") as fp: data = {"cmd":self.CHUNK} while fp.tell() < file_size: data["data"] = fp.read(self.CHUNK_BUF) self.send_data(data) if len(data["data"]) < self.CHUNK_BUF: break
Example 27
Project: ALF Author: blackberry File: __init__.py License: Apache License 2.0 | 5 votes |
def rm_full_dir(path, ignore_errors=False): """ This function is used to remove a directory and all files and directories within it (like `rm -rf`). """ if os.path.isdir(path): try: os.chmod(path, os.stat(path).st_mode | stat.S_IRWXU & ~stat.S_ISVTX) except OSError: pass f_last = 0 while True: f_count = 0 for root, d_names, f_names in os.walk(path): try: os.chmod(root, os.stat(root).st_mode | stat.S_IRWXU & ~stat.S_ISVTX) except OSError: pass for fs_name in f_names + d_names: target = os.path.join(root, fs_name) try: os.chmod(target, os.stat(target).st_mode | stat.S_IRWXU & ~stat.S_ISVTX) except OSError: pass f_count += 1 f_count += 1 # do this until we get the same count twice, ie. all files we can # chmod our way into have been found if f_last == f_count: break f_last = f_count shutil.rmtree(path, ignore_errors)
Example 28
Project: ALF Author: blackberry File: Radamsa.py License: Apache License 2.0 | 5 votes |
def __init__(self): if sys.platform.startswith("linux"): self.bin = os.path.join(TOOL_DIR, "radamsa-linux") if os.path.isfile(self.bin): os.chmod(self.bin, os.stat(self.bin).st_mode | stat.S_IXUSR) else: raise RuntimeError("Missing file %s" % self.bin) elif sys.platform.startswith("win32"): self.bin = os.path.join(TOOL_DIR, "radamsa-windows.exe") if not os.path.isfile(self.bin): raise RuntimeError("Missing file %s" % self.bin) else: raise RuntimeError("RadamsaFuzzer not supported on this platform") self.sys_rnd = random.SystemRandom()
Example 29
Project: wechat-alfred-workflow Author: TKkk-iOSer File: workflow.py License: MIT License | 5 votes |
def cached_data_age(self, name): """Return age in seconds of cache `name` or 0 if cache doesn't exist. :param name: name of datastore :type name: ``unicode`` :returns: age of datastore in seconds :rtype: ``int`` """ cache_path = self.cachefile('%s.%s' % (name, self.cache_serializer)) if not os.path.exists(cache_path): return 0 return time.time() - os.stat(cache_path).st_mtime
Example 30
Project: cherrypy Author: cherrypy File: plugins.py License: BSD 3-Clause "New" or "Revised" License | 5 votes |
def run(self): """Reload the process if registered files have been modified.""" for filename in self.sysfiles() | self.files: if filename: if filename.endswith('.pyc'): filename = filename[:-1] oldtime = self.mtimes.get(filename, 0) if oldtime is None: # Module with no .py file. Skip it. continue try: mtime = os.stat(filename).st_mtime except OSError: # Either a module with no .py file, or it's been deleted. mtime = None if filename not in self.mtimes: # If a module has no .py file, this will be None. self.mtimes[filename] = mtime else: if mtime is None or mtime > oldtime: # The file has been deleted or modified. self.bus.log('Restarting because %s changed.' % filename) self.thread.cancel() self.bus.log('Stopped thread %r.' % self.thread.getName()) self.bus.restart() return