@@ -127,9 +127,10 @@ def create_alias(cmd, install, alias, target, *, script_code=None, _link=os.link
127127
128128
129129def _parse_entrypoint_line (line ):
130+ line = line .partition ("#" )[0 ]
130131 name , sep , rest = line .partition ("=" )
131132 name = name .strip ()
132- if name and sep and rest :
133+ if name and name [ 0 ]. isalnum () and sep and rest :
133134 mod , sep , rest = rest .partition (":" )
134135 mod = mod .strip ()
135136 if mod and sep and rest :
@@ -140,40 +141,43 @@ def _parse_entrypoint_line(line):
140141 return None , None , None
141142
142143
144+ def _scan_one (root ):
145+ # Scan d for dist-info directories with entry_points.txt
146+ dist_info = [d for d in root .glob ("*.dist-info" ) if d .is_dir ()]
147+ LOGGER .debug ("Found %i dist-info directories in %s" , len (dist_info ), root )
148+ entrypoints = [f for f in [d / "entry_points.txt" for d in dist_info ] if f .is_file ()]
149+ LOGGER .debug ("Found %i entry_points.txt files in %s" , len (entrypoints ), root )
150+
151+ # Filter down to [console_scripts] and [gui_scripts]
152+ for ep in entrypoints :
153+ try :
154+ f = open (ep , "r" , encoding = "utf-8" , errors = "strict" )
155+ except OSError :
156+ LOGGER .debug ("Failed to read %s" , ep , exc_info = True )
157+ continue
158+
159+ with f :
160+ alias = None
161+ for line in f :
162+ if line .strip () == "[console_scripts]" :
163+ alias = dict (windowed = 0 )
164+ elif line .strip () == "[gui_scripts]" :
165+ alias = dict (windowed = 1 )
166+ elif line .lstrip ().startswith ("[" ):
167+ alias = None
168+ elif alias is not None :
169+ name , mod , func = _parse_entrypoint_line (line )
170+ if name and mod and func :
171+ yield (
172+ {** alias , "name" : name },
173+ f"import sys; from { mod } import { func } ; sys.exit({ func } ())" ,
174+ )
175+
176+
143177def _scan (prefix , dirs ):
144178 for dirname in dirs or ():
145179 root = prefix / dirname
146-
147- # Scan d for dist-info directories with entry_points.txt
148- dist_info = [d for d in root .listdir () if d .match ("*.dist-info" ) and d .is_dir ()]
149- LOGGER .debug ("Found %i dist-info directories in %s" , len (dist_info ), root )
150- entrypoints = [f for f in [d / "entry_points.txt" for d in dist_info ] if f .is_file ()]
151- LOGGER .debug ("Found %i entry_points.txt files in %s" , len (entrypoints ), root )
152-
153- # Filter down to [console_scripts] and [gui_scripts]
154- for ep in entrypoints :
155- try :
156- f = open (ep , "r" , encoding = "utf-8" , errors = "strict" )
157- except OSError :
158- LOGGER .debug ("Failed to read %s" , ep , exc_info = True )
159- continue
160-
161- with f :
162- alias = None
163- for line in f :
164- if line .strip () == "[console_scripts]" :
165- alias = dict (windowed = 0 )
166- elif line .strip () == "[gui_scripts]" :
167- alias = dict (windowed = 1 )
168- elif line .lstrip ().startswith ("[" ):
169- alias = None
170- elif alias is not None :
171- name , mod , func = _parse_entrypoint_line (line )
172- if name and mod and func :
173- yield (
174- {** alias , "name" : name },
175- f"import sys; from { mod } import { func } ; sys.exit({ func } ())" ,
176- )
180+ yield from _scan_one (root )
177181
178182
179183def scan_and_create_entrypoints (cmd , install , shortcut , _create_alias = create_alias ):
0 commit comments