2626import sys
2727import subprocess
2828import shutil
29- import importlib
30- import unittest
3129import psutil
30+ import argparse
3231
32+ try :
33+ from ament_virtualenv .glob_requirements import glob_requirements
34+ from ament_virtualenv .combine_requirements import combine_requirements
35+ from ament_virtualenv .build_venv import build_venv
36+ ament_virtualenv_import_failed = False
37+ except :
38+ ament_virtualenv_import_failed = True
39+ #
3340
3441def find_program (name = 'build_venv.py' , package = 'ament_virtualenv' ):
3542 '''
43+ Helper function to find the modules that are part of this
44+ package (glob_requirements, combine_requirements, build_venv),
45+ in cases where a direct import failes due to python path issues.
3646 '''
3747 ament_prefix_path = os .environ .get ("AMENT_PREFIX_PATH" )
3848 if not ament_prefix_path :
@@ -52,58 +62,90 @@ def find_program(name='build_venv.py', package='ament_virtualenv'):
5262def install_venv (install_base , package_name , python_version = '2' ):
5363 venv_install_dir = os .path .join (install_base , 'venv' )
5464 bin_dir = os .path .join (install_base , 'bin' )
55- #
65+ #
5666 # Build the virtual environment
5767 python = shutil .which ("python" )
5868 if not python :
5969 print ("ERROR: Failed to locate python" , file = sys .stderr )
60- return
70+ return 1
6171
6272 # glob_requirements --package-name ament_cmake_haros
63- glob_requirements = find_program (name = 'glob_requirements.py' , package = 'ament_virtualenv' )
64- if not glob_requirements :
65- print ("ERROR: Failed to locate glob_requirements" , file = sys .stderr )
66- return
67- cmd = [
68- python ,
69- glob_requirements ,
70- '--package-name' ,
71- package_name
72- ]
73- requirements_list = subprocess .check_output (cmd )
74- requirements_list = requirements_list .decode ("utf-8" ).strip ()
75-
76- # combine_requirements --requirements-list a/requirements.txt;b/requirements.txt --output-file x/generated_requirements.txt
77- combine_requirements = find_program (name = 'combine_requirements.py' , package = 'ament_virtualenv' )
78- if not combine_requirements :
79- print ("ERROR: Failed to locate combine_requirements" , file = sys .stderr )
80- return
73+ if ament_virtualenv_import_failed == True :
74+ # Fallback: try to find the command line script and run it
75+ glob_requirements_py = find_program (name = 'glob_requirements.py' , package = 'ament_virtualenv' )
76+ if not glob_requirements_py :
77+ print ("ERROR: Failed to locate glob_requirements" , file = sys .stderr )
78+ return 1
79+ cmd = [
80+ python ,
81+ glob_requirements_py ,
82+ '--package-name' ,
83+ package_name
84+ ]
85+ requirements_list = subprocess .check_output (cmd )
86+ requirements_list = requirements_list .decode ("utf-8" ).strip ()
87+ else :
88+ # Use the module directly
89+ requirements_list = glob_requirements (package_name = package_name , no_deps = False )
90+ # ^ glob_requirements
91+ #
92+ # combine_requirements --requirements-list a/requirements.txt;b/requirements.txt
93+ # --output-file x/generated_requirements.txt
8194 generated_requirements = '/tmp/test_ament_virtualenv-generated_requirements.txt'
82- cmd = [
83- python ,
84- combine_requirements ,
85- '--requirements-list' ,
86- requirements_list ,
87- '--output-file' ,
88- generated_requirements
89- ]
90- subprocess .check_output (cmd )
91-
92- build_venv = find_program (name = 'build_venv.py' , package = 'ament_virtualenv' )
93- if not build_venv :
94- print ("ERROR: Failed to locate build_venv" , file = sys .stderr )
95- return
96- cmd = [
97- python ,
98- build_venv ,
99- '--root-dir' , venv_install_dir ,
100- '--requirements' , generated_requirements ,
101- '--retries' , '3' ,
102- '--python-version' , python_version ,
103- # '--use-system-packages',
104- '--extra-pip-args' , '\" -qq\" ' ,
105- ]
106- ret = subprocess .check_output (cmd )
95+ if ament_virtualenv_import_failed :
96+ combine_requirements_py = find_program (name = 'combine_requirements.py' , package = 'ament_virtualenv' )
97+ if not combine_requirements_py :
98+ print ("ERROR: Failed to locate combine_requirements" , file = sys .stderr )
99+ return 1
100+ cmd = [
101+ python ,
102+ combine_requirements_py ,
103+ '--requirements-list' ,
104+ requirements_list ,
105+ '--output-file' ,
106+ generated_requirements
107+ ]
108+ subprocess .check_output (cmd )
109+ else :
110+ requirements_files = []
111+ for requirements_file in requirements_list .split (';' ):
112+ requirements_files .append (open (requirements_file , 'r' ))
113+ generated_requirements_file = open (generated_requirements , 'w' )
114+ combine_requirements (
115+ requirements_list = requirements_files ,
116+ output_file = generated_requirements_file
117+ )
118+ for requirements_file in requirements_files :
119+ requirements_file .close ()
120+ generated_requirements_file .close ()
121+ # ^ combine_requirements
122+ #
123+ if ament_virtualenv_import_failed :
124+ build_venv_py = find_program (name = 'build_venv.py' , package = 'ament_virtualenv' )
125+ if not build_venv_py :
126+ print ("ERROR: Failed to locate build_venv" , file = sys .stderr )
127+ return 1
128+ cmd = [
129+ python ,
130+ build_venv_py ,
131+ '--root-dir' , venv_install_dir ,
132+ '--requirements' , generated_requirements ,
133+ '--retries' , '3' ,
134+ '--python-version' , python_version ,
135+ # '--use-system-packages',
136+ '--extra-pip-args' , '\" -qq\" ' ,
137+ ]
138+ ret = subprocess .check_output (cmd )
139+ else :
140+ ret = build_venv (
141+ root_dir = venv_install_dir ,
142+ python_version = python_version ,
143+ requirements_filename = generated_requirements ,
144+ use_system_packages = False ,
145+ extra_pip_args = "-qq" ,
146+ retries = 3
147+ )
148+ print ('XXXXXXXX build_venv returned ' + str (ret ))
107149 #
108150 # Wrapper shell executables we installed
109151 for bin_file in os .listdir (bin_dir ):
@@ -114,6 +156,7 @@ def install_venv(install_base, package_name, python_version='2'):
114156 if not os .path .isfile (bin_path ):
115157 continue
116158 os .rename (bin_path , bin_path + '-venv' )
159+ venv_rel_path = os .path .relpath (venv_install_dir , bin_dir )
117160 # create new file with the name of the previous file
118161 with open (bin_path , "w" ) as f :
119162 f .write ("#!/usr/bin/python3\n " )
@@ -123,16 +166,28 @@ def install_venv(install_base, package_name, python_version='2'):
123166 f .write ("if __name__ == '__main__':\n " )
124167 f .write (" dir_path = os.path.dirname(os.path.realpath(__file__))\n " )
125168 f .write (" bin_path = os.path.join(dir_path, '" + bin_file + "-venv')\n " )
126- f .write (" cmd = '" + venv_install_dir + "/bin/python ' + bin_path\n " )
169+ f .write (" vpy_path = os.path.abspath(os.path.join(dir_path, '" + venv_rel_path + "'))\n " )
170+ f .write (" vpy_path = os.path.join(vpy_path, 'bin', 'python')\n " )
171+ f .write (" cmd = vpy_path + ' ' + bin_path\n " )
127172 f .write (" sys.exit(subprocess.call(cmd, shell=True))\n " )
128173 # change file permissions to executable
129174 st = os .stat (bin_path )
130175 os .chmod (bin_path , st .st_mode | stat .S_IEXEC | stat .S_IXUSR | stat .S_IXGRP | stat .S_IXOTH )
131-
176+ #
177+ return 0
132178
133179def main (argv = sys .argv [1 :]):
134- return 0 # todo
180+ parser = argparse .ArgumentParser ()
181+ parser .add_argument ('--install-base' , required = True )
182+ parser .add_argument ('--package-name' , required = True )
183+ parser .add_argument ('--python-version' , required = True )
184+ args , unknown = parser .parse_known_args ()
185+ return install_venv (
186+ install_base = args .install_base ,
187+ package_name = args .package_name ,
188+ python_version = args .python_version
189+ )
135190
136191
137192if __name__ == "__main__" :
138- main ()
193+ sys . exit ( main () )
0 commit comments