You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

setup.py 7.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. # Copyright (c) Alibaba, Inc. and its affiliates.
  2. # !/usr/bin/env python
  3. import os
  4. import shutil
  5. import subprocess
  6. from setuptools import find_packages, setup
  7. from modelscope.utils.constant import Fields
  8. def readme():
  9. with open('README.md', encoding='utf-8') as f:
  10. content = f.read()
  11. return content
  12. version_file = 'modelscope/version.py'
  13. def get_git_hash():
  14. def _minimal_ext_cmd(cmd):
  15. # construct minimal environment
  16. env = {}
  17. for k in ['SYSTEMROOT', 'PATH', 'HOME']:
  18. v = os.environ.get(k)
  19. if v is not None:
  20. env[k] = v
  21. # LANGUAGE is used on win32
  22. env['LANGUAGE'] = 'C'
  23. env['LANG'] = 'C'
  24. env['LC_ALL'] = 'C'
  25. out = subprocess.Popen(
  26. cmd, stdout=subprocess.PIPE, env=env).communicate()[0]
  27. return out
  28. try:
  29. out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
  30. sha = out.strip().decode('ascii')
  31. except OSError:
  32. sha = 'unknown'
  33. return sha
  34. def get_hash():
  35. assert os.path.exists('.git'), '.git directory does not exist'
  36. sha = get_git_hash()[:7]
  37. return sha
  38. def get_version():
  39. with open(version_file, 'r') as f:
  40. exec(compile(f.read(), version_file, 'exec'))
  41. return locals()['__version__']
  42. def parse_requirements(fname='requirements.txt', with_version=True):
  43. """
  44. Parse the package dependencies listed in a requirements file but strips
  45. specific versioning information.
  46. Args:
  47. fname (str): path to requirements file
  48. with_version (bool, default=False): if True include version specs
  49. Returns:
  50. List[str]: list of requirements items
  51. CommandLine:
  52. python -c "import setup; print(setup.parse_requirements())"
  53. """
  54. import sys
  55. from os.path import exists
  56. import re
  57. require_fpath = fname
  58. def parse_line(line):
  59. """
  60. Parse information from a line in a requirements text file
  61. """
  62. if line.startswith('-r '):
  63. # Allow specifying requirements in other files
  64. target = line.split(' ')[1]
  65. for info in parse_require_file(target):
  66. yield info
  67. else:
  68. info = {'line': line}
  69. if line.startswith('-e '):
  70. info['package'] = line.split('#egg=')[1]
  71. else:
  72. # Remove versioning from the package
  73. pat = '(' + '|'.join(['>=', '==', '>']) + ')'
  74. parts = re.split(pat, line, maxsplit=1)
  75. parts = [p.strip() for p in parts]
  76. info['package'] = parts[0]
  77. if len(parts) > 1:
  78. op, rest = parts[1:]
  79. if ';' in rest:
  80. # Handle platform specific dependencies
  81. # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies
  82. version, platform_deps = map(str.strip,
  83. rest.split(';'))
  84. info['platform_deps'] = platform_deps
  85. else:
  86. version = rest # NOQA
  87. info['version'] = (op, version)
  88. yield info
  89. def parse_require_file(fpath):
  90. with open(fpath, 'r') as f:
  91. for line in f.readlines():
  92. line = line.strip()
  93. if line.startswith('http'):
  94. print('skip http requirements %s' % line)
  95. continue
  96. if line and not line.startswith('#') and not line.startswith(
  97. '--'):
  98. for info in parse_line(line):
  99. yield info
  100. elif line and line.startswith('--find-links'):
  101. eles = line.split()
  102. for e in eles:
  103. e = e.strip()
  104. if 'http' in e:
  105. info = dict(dependency_links=e)
  106. yield info
  107. def gen_packages_items():
  108. items = []
  109. deps_link = []
  110. if exists(require_fpath):
  111. for info in parse_require_file(require_fpath):
  112. if 'dependency_links' not in info:
  113. parts = [info['package']]
  114. if with_version and 'version' in info:
  115. parts.extend(info['version'])
  116. if not sys.version.startswith('3.4'):
  117. # apparently package_deps are broken in 3.4
  118. platform_deps = info.get('platform_deps')
  119. if platform_deps is not None:
  120. parts.append(';' + platform_deps)
  121. item = ''.join(parts)
  122. items.append(item)
  123. else:
  124. deps_link.append(info['dependency_links'])
  125. return items, deps_link
  126. return gen_packages_items()
  127. def pack_resource():
  128. # pack resource such as configs and tools
  129. root_dir = 'package/'
  130. if os.path.isdir(root_dir):
  131. shutil.rmtree(root_dir)
  132. os.makedirs(root_dir)
  133. proj_dir = root_dir + 'modelscope/'
  134. shutil.copytree('./modelscope', proj_dir)
  135. shutil.copytree('./configs', proj_dir + 'configs')
  136. shutil.copytree('./requirements', 'package/requirements')
  137. shutil.copy('./requirements.txt', 'package/requirements.txt')
  138. shutil.copy('./MANIFEST.in', 'package/MANIFEST.in')
  139. shutil.copy('./README.md', 'package/README.md')
  140. if __name__ == '__main__':
  141. # write_version_py()
  142. pack_resource()
  143. os.chdir('package')
  144. install_requires, deps_link = parse_requirements('requirements.txt')
  145. extra_requires = {}
  146. all_requires = []
  147. for field in dir(Fields):
  148. if field.startswith('_'):
  149. continue
  150. extra_requires[field], _ = parse_requirements(
  151. f'requirements/{field}.txt')
  152. all_requires.append(extra_requires[field])
  153. extra_requires['all'] = all_requires
  154. setup(
  155. name='model-scope',
  156. version=get_version(),
  157. description='',
  158. long_description=readme(),
  159. long_description_content_type='text/markdown',
  160. author='Alibaba ModelScope team',
  161. author_email='modelscope@list.alibaba-inc.com',
  162. keywords='',
  163. url='TBD',
  164. packages=find_packages(exclude=('configs', 'tools', 'demo')),
  165. include_package_data=True,
  166. classifiers=[
  167. 'Development Status :: 4 - Beta',
  168. 'License :: OSI Approved :: Apache Software License',
  169. 'Operating System :: OS Independent',
  170. 'Programming Language :: Python :: 3',
  171. 'Programming Language :: Python :: 3.5',
  172. 'Programming Language :: Python :: 3.6',
  173. 'Programming Language :: Python :: 3.7',
  174. ],
  175. license='Apache License 2.0',
  176. tests_require=parse_requirements('requirements/tests.txt'),
  177. install_requires=install_requires,
  178. extras_require=extra_requires,
  179. dependency_links=deps_link,
  180. zip_safe=False)