/opt/stack/keystone/keystone/cmd/manage.pypython
OpenStack全部項目都是基於Python開發,而且都是標準的Python項目,經過setuptools工具管理項目,負責Python模塊的安裝和分發。想知道一個項目有哪些服務組成,最直接有效的辦法就是找到入口函數(main函數)在哪裏,只要是標準的基於setuptools管理的項目的全部入口函數都會在項目根目錄的setup.cfg文件中定義,console_scripts就是全部服務組件的入口,好比nova(Mitaka版本)的setup.cfg的console_scripts以下:
[entry_points]
...
console_scripts =linux
進入到cd /opt/stack/keystone/keystone/cmd/ 這個目錄,而後python命令進入python環境bootstrap
pythonpython2.7
import os
import sys函數
>>> os.getcwd() #獲區當前目錄
'/opt/stack/keystone/keystone/cmd'工具
>>> dir1 = '/opt/stack/keystone/keystone/cmd' #獲區該目錄下的文件列表
>>> os.listdir(dir1)
['__init__.py', 'status.py', 'bootstrap.py', 'cli.pyc', 'doctor', 'manage.py', '__init__.pyc', 'manage.pyc', 'cli.py', 'bootstrap.pyc']spa
>>> print os.path.abspath('manage.py') #注意括號中的文件名須要加上引號
/opt/stack/keystone/keystone/cmd/manage.py
>>> os.path.abspath('manage.py')
'/opt/stack/keystone/keystone/cmd/manage.py'
>>> orm
>>> possible_topdir = os.path.normpath(os.path.join(os.path.abspath('manage.py'),
... os.pardir,
... os.pardir,
... os.pardir))
>>> possible_topdir
'/opt/stack/keystone'
>>> os.pardir
'..'
>>> 索引
>>> dir2 = os.path.join(possible_topdir, 'keystone','__init__.py')
>>> dir2
'/opt/stack/keystone/keystone/__init__.py'
>>> ip
>>> os.path.exists('/opt/stack/keystone/keystone/__init__.py')
True
>>>
>>> sys.path.insert(0, possible_topdir) #最終結果就是往sys.path裏添加了/opt/stack/keystone這個路徑,往列表裏指定索引位置插入元素sys.path.insert(0, possible_topdir)
>>> sys.path #是一個列表
['', '/opt/stack/keystone', '/opt/stack/cinder', '/opt/stack/neutron', '/opt/stack/nova', '/opt/stack/placement', '/opt/stack/horizon', '/opt/stack/glance', '/opt/stack/tempest', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
>>>
>>> sys.argv # 返回一個空列表
['']
/opt/stack/keystone/keystone/cmd/cli.py 經過manage.py調用cli.py裏的main函數
/usr/local/lib/python2.7/dist-packages 中能夠找到oslo