Mar-14-2021, 06:36 PM
i don't understand this error message
Output:t2a/phil /home/phil 452> py py/cmd/lndir.py -v foo bar/a/b/c/x
File "py/cmd/lndir.py", line 133
print(f'makedirs({dir!r},mode={mode!e}) todo{n}')
^
SyntaxError: f-string: invalid conversion character: expected 's', 'r', or 'a'
lt2a/phil /home/phil 453>my first thought was to check the line before it. i'm sure lots of you will beg for the code, since this is an open project, i can post it. so here it is:#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import link,makedirs,mkdir
from os.path import lexists,join,split
from sys import argv,stderr
modes = dict( # aliases for mode settings
x = 0o0100,
xx = 0o0110,
xxx = 0o0111,
r = 0o0400,
rr = 0o0440,
rrr = 0o0444,
rx = 0o0500,
rxx = 0o0510,
rxxx = 0o0511,
rxr = 0o0540,
rxrx = 0o0550,
rxrxx = 0o0551,
rxrr = 0o0544,
rxrxr = 0o0554,
rxrxrx = 0o0555,
rw = 0o0600,
rwr = 0o0640,
rwrr = 0o0644,
rwrw = 0o0660,
rwrww = 0o0662,
rwrwr = 0o0664,
rwrwrw = 0o0666,
rwx = 0o0700,
rwxx = 0o0710,
rwxxx = 0o0711,
rwxr = 0o0740,
rwxrr = 0o0744,
rwxrx = 0o0750,
rwxrxx = 0o0751,
rwxrxr = 0o0754,
rwxrxrx = 0o0755,
rwxrwx = 0o0770,
rwxrwxx = 0o0771,
rwxrwxr = 0o0774,
rwxrwxrx = 0o0775,
rwxrwxrwx = 0o0777,
rwxrwxrwt = 0o1777,
rwxrwsrwx = 0o2777,
rwxrwsrwt = 0o3777,
rwsrwxrwx = 0o4777,
rwsrwxrwt = 0o5777,
rwsrwsrwx = 0o6777,
rwsrwsrwt = 0o7777,
dir = 0o0750,
read = 0o0400,
write = 0o0600,
public = 0o0444,
private = 0o0400,
)
def help(*args):
if args:
arg = args[0]
return arg.lower() in ('-h','--help')
print(' lndir [options] srcpath destdir')
return 1
def version(*args):
if args:
arg = args[0]
return arg.lower() in ('-v','--version')
print(' lndir version 0.0.6')
return 1
def main(args):
parents = True
verbose = False
mode = None
names = []
while args:
arg = args.pop(0)
if not arg:
exit('error: empty argument in command line')
elif arg[0] != '-':
names.append(arg)
elif arg in ('-','--'):
break
elif help(arg):
help()
version()
exit(1)
elif arg in ('-m' '--mode'):
if not args:
exit(f'error: missing argument for {arg}')
mode = args.pop(0)
if not mode:
exit(f'error: empty argument for {arg}')
elif arg.startswith('-m=') or arg.startswith('--mode='):
mode = arg.split('=',1)[1]
if not mode:
exit(f'error: empty value in {arg}')
elif arg in ('-np','--noparents'):
parents = False
elif arg in ('-v','--verbose'):
verbose = True
elif version(arg):
version()
exit(1)
if len(names)!=2:
exit(f'too {("many","few")[len(names)<2]} arguments, expect 2, got {len(names)}: {" ".join(args)!r}')
src,dir = names
par,base = split(src)
dst = join(dir,base)
if isinstance(mode,str):
mode = mode.lower()
if mode in modes:
mode = modes[mode]
try:
mode = int(mode,8)
except Exception:
pass
if isinstance(src,(bytes,bytearray)):
src = ''.join(chr(x)for x in src)
if isinstance(dir,(bytes,bytearray)):
dir = ''.join(chr(x)for x in dir)
for n in (0,1):
try:
print(f'link({src!r},{dst!r}) todo{n}')
link(src,dst)
print(f'link({src!r},{dst!r}) done{n}')
except FileNotFoundError:
if lexists(src):
try:
if isinstance(mode,int):
print(f'makedirs({dir!r},mode={mode!e}) todo{n}')
(makedirs if parents else mkdir)(dir,mode=mode)
print(f'makedirs({dir!r},mode={mode!e}) done{n}')
else:
print(f'makedirs({dir!r}) todo{n}')
(makedirs if parents else mkdir)(dir)
print(f'makedirs({dir!r}) done{n}')
except FileNotFoundError:
exit(f'parent directory missing while creating directory {dir!r}')
except NotADirectoryError:
exit(f'parent directory not a directory while creating directory {dir!r}')
except PermissionError:
exit(f'permission error while creating directory {dir!r}')
except OSError:
exit(f'unknown error while creating directory {dir!r}')
else:
exit((f'{n} source file {src!r}' if lexists(dir) else f'target directory {dir!r}')+' not found')
except FileExistsError:
exit(f'target file {dst!r} exists')
except NotADirectoryError:
exit(f'target directory {dir!r} exists but is not a directory')
except PermissionError:
exit(f'target directory {dir!r} or source file {src!r} permission error')
if verbose:
print(f'{src!r} == {dst!r}',flush=True)
return 0
if __name__ == '__main__':
cmdpath = argv.pop(0)
try:
result = main(argv)
except BrokenPipeError:
exit(141)
except KeyboardInterrupt:
print(flush=True)
exit(98)
if isinstance(result,(bytes,bytearray)):
result=''.join(chr(x)for x in result)
if isinstance(result,str):
print(result,file=stderr,flush=True)
result=1
if result is None or result is True:
result=0
elif result is False:
result=1
exit(int(float(result)))
Tradition is peer pressure from dead people
What do you call someone who speaks three languages? Trilingual. Two languages? Bilingual. One language? American.
What do you call someone who speaks three languages? Trilingual. Two languages? Bilingual. One language? American.
