Skip to content

Commit a5bb951

Browse files
authored
Merge pull request #503 from martindurant/dont_import_pyarrow
Don't import pyarrow just to check version
2 parents 9ac051d + e93bb32 commit a5bb951

File tree

2 files changed

+54
-11
lines changed

2 files changed

+54
-11
lines changed

fsspec/spec.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22
import logging
33
import os
44
import warnings
5-
from distutils.version import LooseVersion
65
from errno import ESPIPE
76
from hashlib import sha256
7+
from distutils.version import LooseVersion
88
from glob import has_magic
99

1010
from .dircache import DirCache
1111
from .transaction import Transaction
12-
from .utils import read_block, tokenize, stringify_path, other_paths
12+
from .utils import (
13+
read_block,
14+
tokenize,
15+
stringify_path,
16+
other_paths,
17+
get_package_version_without_import,
18+
)
1319
from .config import apply_config
1420

1521
logger = logging.getLogger("fsspec")
@@ -72,16 +78,13 @@ def __call__(cls, *args, **kwargs):
7278
return obj
7379

7480

75-
try: # optionally derive from pyarrow's FileSystem, if available
81+
pa_version = get_package_version_without_import("pyarrow")
82+
if pa_version and LooseVersion(pa_version) < LooseVersion("2.0"):
7683
import pyarrow as pa
77-
except ImportError:
78-
up = object
84+
85+
up = pa.filesystem.DaskFileSystem
7986
else:
80-
# only derive from the legacy pyarrow's FileSystem for older pyarrow versions
81-
if LooseVersion(pa.__version__) < LooseVersion("2.0"):
82-
up = pa.filesystem.DaskFileSystem
83-
else:
84-
up = object
87+
up = object
8588

8689

8790
class AbstractFileSystem(up, metaclass=_Cached):

fsspec/utils.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import pathlib
55
import re
6+
import sys
67
from urllib.parse import urlsplit
78

89

@@ -383,10 +384,13 @@ def can_be_local(path):
383384
return False
384385

385386

386-
def setup_logger(logname, level="DEBUG"):
387+
def setup_logger(logname, level="DEBUG", clear=True):
388+
"""Add standard logging handler to logger of given name"""
387389
import logging
388390

389391
logger = logging.getLogger(logname)
392+
if clear:
393+
logger.handlers.clear()
390394
handle = logging.StreamHandler()
391395
formatter = logging.Formatter(
392396
"%(asctime)s - %(name)s - %(levelname)s " "- %(message)s"
@@ -395,3 +399,39 @@ def setup_logger(logname, level="DEBUG"):
395399
logger.addHandler(handle)
396400
logger.setLevel(level)
397401
return logger
402+
403+
404+
def get_package_version_without_import(name):
405+
"""For given package name, try to find the version without importing it
406+
407+
Import and package.__version__ is still the backup here, so an import
408+
*might* happen.
409+
410+
Returns either the version string, or None if the package
411+
or the version was not readily found.
412+
"""
413+
if name in sys.modules:
414+
mod = sys.modules[name]
415+
if hasattr(mod, "__version__"):
416+
return mod.__version__
417+
if sys.version_info >= (3, 8):
418+
try:
419+
import importlib.metadata
420+
421+
return importlib.metadata.distribution(name).version
422+
except ImportError:
423+
pass
424+
else:
425+
try:
426+
import importlib_metadata
427+
428+
return importlib_metadata.distribution(name).version
429+
except ImportError:
430+
pass
431+
try:
432+
import importlib
433+
434+
mod = importlib.import_module(name)
435+
return mod.__version__
436+
except (ImportError, AttributeError):
437+
return None

0 commit comments

Comments
 (0)