Sub routine to run the application.
54def run(args: argparse.Namespace) -> int:
55
56 rc: int = 0
57 cwd = os.getcwd()
58
59 try:
60 while True:
61
62
63 try:
64
65 version: str = args.version
66 realm = 'argument'
67 except AttributeError:
68
70 if version == '':
71 log.error(
'Cannot determine the version number of the "pyenv" Python version.')
72 log.info(
'Trying next, set the version number explicitly. See --help.')
73
74 rc = 1
75 break
76
77 version = version.strip()
79 props: bool = args.props
80
81 log.info(
'Creating Python virtual environment in "pyenv":')
82 log.info(
' * Version: {} ({})'.format(version, realm))
84 log.info(
' * Set project properties: {}'.format(props))
85
87 version,
88 realm,
89 venv_capable=True
90 )
91 if rc != 0:
92 break
93 selected_version = os.path.basename(selected_version_dir)
94
95 envs_dir = os.path.join(selected_version_dir, 'envs')
96 if not os.path.isdir(envs_dir):
97 log.verbose(
'Creating "{}" folder ...'.format(envs_dir))
98 os.mkdir(envs_dir)
99
100 venv_dir = os.path.join(envs_dir, name)
101 if os.path.isdir(venv_dir):
102
103 log.verbose(
'Overriding folder "{}" ...'.format(venv_dir))
104 shutil.rmtree(venv_dir)
105 else:
106 log.verbose(
'Creating folder "{}" ...'.format(venv_dir))
107
108 python_exe_path = os.path.join(
109 selected_version_dir,
110 'python.exe'
111 )
112
113 cmd = [
114 python_exe_path,
115 '-m',
116 'venv',
117 venv_dir
118 ]
120 log.info(
'This will take some seconds ...')
121
122 cp = subprocess.run(
123 cmd,
124 stdout=subprocess.DEVNULL,
125 stderr=subprocess.DEVNULL,
126 shell=True
127 )
128 rc = cp.returncode
129 if rc != 0:
131 'Unexpectedly cannot create ' +
132 'Python virtual environment.'
133 )
134 log.info(
'Check/repair Python and "pyenv". Then try again.')
135
136 rc = 1
137 break
138
139
140 venv_version_dir = os.path.join(
141 os.environ['PYENV_ROOT'],
142 'versions',
143 '{}-{}'.format(name, selected_version)
144 )
146
148 'Overriding junction "{}" → "{}" ...'.format(
149 venv_version_dir,
150 venv_dir
151 )
152 )
153 os.remove(venv_version_dir)
154 else:
156 'Creating junction "{}" → "{}" ...'.format(
157 venv_version_dir,
158 venv_dir
159 )
160 )
161
162 if ctypes.windll.shell32.IsUserAnAdmin() == 0:
163
164
165 s = input("\x1b[94mDo you permit needed 'Administrator' privileges?\x1b[0m [\x1b[92mY\x1b[0m|\x1b[91mn\x1b[0m]: ").strip().upper()
166 if len(s) == 0:
167 s = 'Y'
168 else:
169 s = s[:1]
170 if s == 'N':
171
172 rc = 130
173 break
174 cmd = 'powershell -command "Start-Process -FilePath \'{}\' -ArgumentList \'{}\', \'{}\' -Verb runAs -Wait"'.format(
175 os.path.join(
176 os.path.dirname(os.path.abspath(__file__)),
177 'create_junction.bat'
178 ),
179 venv_version_dir,
180 venv_dir
181 )
183 cp = subprocess.run(
184 cmd,
185 shell=True
186 )
187 else:
188
189
190 cmd = 'powershell -file "{}" "{}" "{}"'.format(
191 os.path.join(
192 os.path.dirname(os.path.abspath(__file__)),
193 'create_junction.ps1'
194 ),
195 venv_version_dir,
196 venv_dir
197 )
199 cp = subprocess.run(
200 cmd,
201 shell=True
202 )
203 rc = cp.returncode
204 if rc == 0:
205 log.success(
'Junction "{}" → "{}" has been created.'.format(
206 venv_version_dir,
207 venv_dir
208 ))
209 else:
211 'Unexpectedly cannot create junction to Python virtual environment directory.'
212 )
214 'Analyze/configure your file access/permissions of the junction or decide to call this script as "Administrator". Then try again.'
215 )
216
217 rc = 1
218 break
219 if props:
222 if rc == 0:
223 log.verbose(
'Project properties successfully set.')
224 else:
225 log.error(
'Cannot set project properties.')
226
227 print('')
229 'Virtual environment "{}" is installed '.format(name) +
230 'in "pyenv", depending on "Python {}".'.format(selected_version)
231 )
232
233 break
234
235 except:
237 rc = 1
238 finally:
239 os.chdir(cwd)
240 return rc
241
242
243
244
tuple[(str, None), int] selectVersionDir(str ver, str realm, venv_capable=False)
Find the best version, matching the requirements.
str fName(str natural_name)
Convert a natural name into stripped functional name, without spaces, which is lowercase,...
(str, str) getPythonVersion()
Get selected global/local Python version in "pyenv".
bool isJunction(str path)
Check if path is a junction, which has been created e.g.
int setProjectProperties(str ver, str env)
Set/override project property files.
verbose((str, tuple) msg)
Log verbose message colored to console only.
success((str, tuple) msg)
Log success message colored to console only.
info((str, tuple) msg)
Log info message colored to console only.
error((str, tuple) msg)
Log error message colored to console only.