Skip To Content

Пример: Регистрация папок и баз данных, перечисленных в текстовом файле

В этом примере скрипт прочитает список текстовых файлов с местоположениями ваших данных и зарегистрирует все папки и базы данных в ArcGIS Server. Хотя вы можете зарегистрировать базы данных и папки с помощью Менеджера (Manager) или ArcGIS for Desktop, быстрее будет использовать этот скрипт, особенно, если зарегистрировать надо много местоположений.

Входной файл должен иметь следующую структуру:

#dsName|dsType|serverPath|clientPath|hostname

dsName=sharedData|dsType=FOLDER|serverPath=C:\data|clientPath=C:\data
dsName=qalab|dsType=FOLDER|serverPath=\\qalab_server\data|clientPath=c:\mydata|hostname=qalab_publisher
dsName=pebbles|dsType=DATABASE|serverPath=C:\data\SDE_Connections\Connection to pebbles864.sde|clientPath=C:\dataSDE_Connections\Connection to pebbles864.sde
dsName=bedrock|dsType=DATABASE|serverPath=C:\data\SDE_Connections\Connection to bedrock.sde|clientPath=C:\dataSDE_Connections\Connection to armenia.sde
dsName=oaktree|dsType=DATABASE|serverPath=C:\data\SDE_Connections\Connection to oaktree.sde|clientPath=managed

  • dsName – имя элемента хранения данных. Любое присвоенное вами имя.
  • dsType – тип регистрируемого элемента хранения данных Это может быть FOLDER или DATABASE.
  • serverPath – путь к данным, отображаемый для серверного компьютера.
  • clientPath – путь к данным, отображаемый для компьютеров издателей. Если это не указать, будет использоваться путь к серверным данным. Если ввести ключевое слово managed, то это будет означать, что вы регистрируете этот элемент хранения данных как управляемую базу данных ArcGIS Server (ArcGIS Server's Managed Database).
  • hostname – имя компьютера издателя. Требуется только, когда clientPath является путем на основе папок (folder-based path). Если это свойство не указать, то будет использоваться имя компьютера, на котором выполняется скрипт.

До начала работы с этим скриптом рекомендуется прочитать О регистрации данных на сервере (About registering your data with the server).

import sys,os

import getpass

import arcpy

import codecs

def main(argv=None):
    
    # Ask for admin user name and password
    
    username = raw_input("Enter user name: ")
    password = getpass.getpass("Enter password: ")
    
    # Ask for server name & port
    serverName = raw_input("Enter server name: ")
    serverPort = raw_input("Enter server port: ")
 
    # Create a connection file to the server and save it in the same location as that of the script
    serverURL="http://"+serverName+":"+str(serverPort)+"/arcgis/admin"
    try:
        arcpy.mapping.CreateGISServerConnectionFile("PUBLISH_GIS_SERVICES",os.curdir,serverName+".ags",serverURL,"ARCGIS_SERVER",username=username,password=password)
    except Exception, e:
            print e.message    
    
    agsConnection = os.path.join(os.curdir, serverName+".ags")
    
    if not os.path.isfile(agsConnection):
        print("Unable to connect to ArcGIS Server. Exiting.")
        sys.exit(1)

    # Input File that contains the data store information
    dataStoresFile = raw_input("Path to pipe-delimited text file containing datastore information: ")
    
    num = 0 
    datastores = {}
    
    for datastoreRow in readlinesFromInputFile(dataStoresFile):
            
        datastoreEntry = {}
        
        for index in range(len(datastoreRow)):
            
            datastoreProp = datastoreRow[index].split("=")
            
            if datastoreProp[0] == "dsName":
                datastoreEntry["connection_name"] = datastoreProp[1]
            if datastoreProp[0] == "dsType":
                datastoreEntry["datastore_type"] = datastoreProp[1]
            if datastoreProp[0] == "serverPath":
                datastoreEntry["server_path"] = datastoreProp[1]
            if datastoreProp[0] == "clientPath":
                datastoreEntry["client_path"] = datastoreProp[1]
            if datastoreProp[0] == "hostname":
                datastoreEntry["hostname"] = datastoreProp[1]
         
            # Add the datastore information to a dictionary
            datastores["datastore" + str(num)] = datastoreEntry
        
        num +=1

    # Call helper functions to register datastores
    addDataStores(datastores,agsConnection)

# A function that reads lines from the input file
def readlinesFromInputFile(filename, delim='|'):
    file = codecs.open(filename,'r','utf-8-sig')
    for line in file.readlines():
        # Remove the trailing whitespaces and the newline characters
        line = line.rstrip()
        
        if line.startswith('#') or len(line) == 0:
            pass # Skip the lines that contain # at the beginning or any empty lines
        else:
            # Split the current line into list
            yield line.split(delim)
    file.close()
    
def addDataStores(datastoresDict,agsConnection):
    
    for datastoreToAdd in datastoresDict:
        # Build the dictionary with the role name and description               
        datastoresDict[datastoreToAdd]["connection_file"] =  agsConnection
        
        print "Adding the datastore: " + datastoresDict[datastoreToAdd]['connection_name']
        
        try:
            arcpy.AddDataStoreItem(**datastoresDict[datastoreToAdd])
            print "Successfully added the datastore: " + datastoresDict[datastoreToAdd]['connection_name'] 
        except Exception, e:
            print "Adding of the datastore: " + datastoresDict[datastoreToAdd]['connection_name'] + " failed."
            print e.message

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))