Opened 6 years ago
Last modified 5 years ago
#3773 reopened defect
shutil_which() throws an exception on Linux + Python 3
Reported by: | pmav99 | Owned by: | |
---|---|---|---|
Priority: | normal | Milestone: | 8.0.0 |
Component: | Python | Version: | svn-trunk |
Keywords: | python3 | Cc: | |
CPU: | Unspecified | Platform: | Unspecified |
Description ¶
Traceback (most recent call last): File "raster/r.report/testsuite/test_r_report.py", line 68, in test_output self.assertModule('r.report', map='lakes', output=self.outfile) File "/home/feanor/Prog/git/grass-p3/repo/dist.x86_64-pc-linux-gnu/etc/python/grass/gunittest/case.py", line 1145, in assertModule if not shutil_which(module.name): File "/home/feanor/Prog/git/grass-p3/repo/dist.x86_64-pc-linux-gnu/etc/python/grass/script/core.py", line 225, in shutil_which name = os.path.join(encode(dir), thefile) File "/usr/lib/python3.7/posixpath.py", line 94, in join genericpath._check_arg_types('join', a, *p) File "/usr/lib/python3.7/genericpath.py", line 151, in _check_arg_types raise TypeError("Can't mix strings and bytes in path components") from None TypeError: Can't mix strings and bytes in path components
This was introduced at https://trac.osgeo.org/grass/changeset/73930
A possible resolution could be:
import six if six.PY3: shutil_which = shutil.which else: def shutil_which(...): # ...
Change History (7)
comment:1 by , 6 years ago
Keywords: | python3 added |
---|---|
Milestone: | → 7.8.0 |
comment:2 by , 6 years ago
comment:3 by , 6 years ago
Replying to pmav99:
A possible resolution could be:
import six if six.PY3: shutil_which = shutil.which else: def shutil_which(...): # ...
Could you please provide a patch? I can also grab it from github if that's easier for you.
comment:4 by , 6 years ago
That's the least invasive patch I can think of:
Index: lib/python/script/core.py =================================================================== --- lib/python/script/core.py (revision 74173) +++ lib/python/script/core.py (working copy) @@ -164,7 +164,7 @@ return set(cmd), scripts - +# TODO: Please replace this function with shutil.which() before 8.0 comes out # replacement for which function from shutil (not available in all versions) # from http://hg.python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068 # added because of Python scripts running Python scripts on MS Windows @@ -239,6 +239,8 @@ return name return None +if sys.version_info.major > 2: + shutil_which = shutil.which # Added because of scripts calling scripts on MS Windows. # Module name (here cmd) differs from the file name (does not have extension).
comment:5 by , 6 years ago
If there are not any problems with the patch, please apply it. It is really needed when testing with Python 3.
comment:7 by , 6 years ago
Milestone: | 7.8.0 → 8.0.0 |
---|---|
Resolution: | fixed |
Status: | closed → reopened |
Reopened with G8.0.0 milestone to remove TODO of r74225 in lib/python/script/core.py
167 # TODO: Please replace this function with shutil.which() before 8.0 comes out 168 168 # replacement for which function from shutil (not available in all versions) 169 169 # from http://hg.python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068
Note:
See TracTickets
for help on using tickets.
shutil_which
is being used byassertModule
which practically means that it is not currently possible to rungunnitest
based tests on Python 3.Please prioritize this.