मैं कैसे ArcMap द्वारा उपयोग किए जाने वाले प्रोग्राम "Python.exe" का पथ प्राप्त कर सकता हूं


16

मैं C # में ArcMap के ऐड-इन के साथ काम कर रहा हूं। C # कोड से, मैंने कुछ पायथन स्क्रिप्ट निष्पादित की हैं। अब, उन स्क्रिप्ट को चलाने के लिए, मेरे पास हार्ड-कोडेड अजगर पथ है। लेकिन यह पोर्टेबल नहीं है। इसलिए, मैं कोड से पायथन के निष्पादन योग्य मार्ग को प्राप्त करना चाहता हूं और इसका उपयोग करना चाहता हूं।

सवाल:

मैं ArcMap द्वारा C # कोड से उपयोग किए जाने वाले पायथन निष्पादन योग्य का मार्ग कैसे प्राप्त कर सकता हूं?

संपादित करें:

आपके सुझावों से, अब मैं पायथन पथ प्राप्त करने के लिए "पथ वातावरण" का उपयोग कर रहा हूं।

//get python path from environtment variable
string GetPythonPath()
{
    IDictionary environmentVariables = Environment.GetEnvironmentVariables();
    string pathVariable = environmentVariables["Path"] as string;
    if (pathVariable != null)
    {
        string[] allPaths = pathVariable.Split(';');
        foreach (var path in allPaths)
        {
            string pythonPathFromEnv = path + "\\python.exe";
            if (File.Exists(pythonPathFromEnv))
                return pythonPathFromEnv;
        }
    }
}

लेकिन एक समस्या है:

जब मेरी मशीन में अजगर का अलग संस्करण स्थापित किया गया है, तो इस बात की कोई गारंटी नहीं है कि, "python.exe" मैं उपयोग कर रहा हूं, ArcGIS भी इसका उपयोग कर रहा है।

मैं "python.exe" पथ प्राप्त करने के लिए किसी अन्य टूल का उपयोग करने की सराहना नहीं करता । इसलिए, मैं वास्तव में सोचता हूं कि क्या रजिस्ट्री कुंजी से रास्ता पाने का कोई तरीका है। के लिए "ArcGIS10.0" की तरह रजिस्ट्री दिखता है: यहाँ छवि विवरण दर्ज करें

और उसके लिए, मैं रास्ता पाने के लिए निम्नलिखित तरीके के बारे में सोच रहा हूं:

//get python path from registry key
string GetPythonPath()
{
    const string regKey = "Python";
    string pythonPath = null;
    try
    {
        RegistryKey registryKey = Registry.LocalMachine;
        RegistryKey subKey = registryKey.OpenSubKey("SOFTWARE");
        if (subKey == null)
            return null;

        RegistryKey esriKey = subKey.OpenSubKey("ESRI");
        if (esriKey == null)
            return null;

        string[] subkeyNames = esriKey.GetSubKeyNames();//get all keys under "ESRI" key
        int index = -1;
     /*"Python" key contains arcgis version no in its name. So, the key name may be 
     varied version to version. For ArcGIS10.0, key name is: "Python10.0". So, from
     here I can get ArcGIS version also*/
        for (int i = 0; i < subkeyNames.Length; i++)
        {
            if (subkeyNames[i].Contains("Python"))
            {
                index = i;
                break;
            }
        }
        if(index < 0)
            return null;
        RegistryKey pythonKey = esriKey.OpenSubKey(subkeyNames[index]);

        string arcgisVersion = subkeyNames[index].Remove(0, 6); //remove "python" and get the version
        var pythonValue = pythonKey.GetValue("Python") as string;
        if (pythonValue != "True")//I guessed the true value for python says python is installed with ArcGIS.
            return;

        var pythonDirectory = pythonKey.GetValue("PythonDir") as string;
        if (pythonDirectory != null && Directory.Exists(pythonDirectory))
        {
            string pythonPathFromReg = pythonDirectory + "ArcGIS" + arcgisVersion + "\\python.exe";
            if (File.Exists(pythonPathFromReg))
                pythonPath = pythonPathFromReg;
        }  
    }
    catch (Exception e)
    {
        MessageBox.Show(e + "\r\nReading registry " + regKey.ToUpper());
        pythonPath = null;
    }
    return pythonPath ;
}

लेकिन दूसरी प्रक्रिया का उपयोग करने से पहले, मुझे अपने अनुमानों के बारे में सुनिश्चित होना चाहिए। अनुमान हैं:

  1. अजगर के साथ जुड़े "सच्चे" का अर्थ है कि आर्कनिस के साथ अजगर स्थापित है
  2. आर्कजीआईएस 10.0 और ऊपरी संस्करण की रजिस्ट्री कुंजी एक ही प्रक्रिया में लिखी जाएगी।

कृपया मेरे अनुमानों के बारे में कोई स्पष्टीकरण प्राप्त करने में मेरी मदद करें।



3
क्या आपके पास आर्कगैथ पायथन के लिए एक पैठ पर्यावरण चर नहीं है जो आपके ऐड-इन के लिए इंस्टालेशन की आवश्यकता हो?
चाड कूपर

सभी ने कहा, @ चेडकोपर के विचार का सबसे अच्छा तरीका है। पीछे की ओर काम करने की कोशिश करने के बजाय, बस इसे एक बार और सभी के लिए इंस्टॉल-टाइम पर सेट करें।
एलोबिस

@elrobis: मुझे पता है, पथ पर्यावरण में रास्ता तय करना एक अच्छा तरीका है। लेकिन मैं जानना चाहता था कि क्या अजगर को खोजने और उपयोगकर्ता को बाधित किए बिना सब कुछ करने का कोई तरीका है।
ईएमआई

@ blah238 आपके सुझाव के लिए धन्यवाद। मैंने कभी स्क्रिप्ट टूल के साथ काम नहीं किया। हो सकता है कि मुझे इसके बारे में जानने की जरूरत है
ईएमआई

जवाबों:


2

मैंने आपका दूसरा कोड उदाहरण लिया, इसने 64 और 32-बिट OS दोनों पर काम किया, और इसे थोड़ा सरल किया। विंडोज 7 64-बिट पर 10.1 पर मेरे लिए काम करता है, लेकिन जाहिर है कि आपको इसे अधिक से अधिक वातावरण पर परीक्षण करना चाहिए, और जो भी रक्षात्मक प्रोग्रामिंग चेक आपको आवश्यक हैं, उसमें वापस जोड़ें।

पायथन के बिना आर्किग डेस्कटॉप 10.1 को क्लीन-इंस्टॉल करने के परीक्षण के बाद, मैंने पाया कि इसमें Python10.x उपकुंजी शामिल नहीं है, अकेले "पायथन" ट्रू / फाल्स वैल्यू (अभी भी निश्चित नहीं है कि यह किस लिए है, हो सकता है कि आप संपर्क करें) जानना)।

string GetPythonPath()
{
    string pythonPath = null;
    var localmachineKey = Registry.LocalMachine;
    // Check whether we are on a 64-bit OS by checking for the Wow6432Node key (32-bit version of the Software registry key)
    var softwareKey = localmachineKey.OpenSubKey(@"SOFTWARE\Wow6432Node"); // This is the correct key for 64-bit OS's
    if (softwareKey == null) {
        softwareKey = localmachineKey.OpenSubKey("SOFTWARE"); // This is the correct key for 32-bit OS's
    }
    var esriKey = softwareKey.OpenSubKey("ESRI");
    var realVersion = (string)esriKey.OpenSubKey("ArcGIS").GetValue("RealVersion"); // Get the "real", canonical version of ArcGIS
    var shortVersion = String.Join(".", realVersion.Split('.').Take(2).ToArray()); // Get just the Major.Minor part of the version number, e.g. 10.1
    var pythonKey = esriKey.OpenSubKey("Python" + shortVersion); // Open the Python10.x sub-key
    if (pythonKey == null) {
        throw new InvalidOperationException("Python not installed with ArcGIS!");
    }
    var pythonDirectory = (string)pythonKey.GetValue("PythonDir");
    if (Directory.Exists(pythonDirectory))
    {
        // Build path to python.exe
        string pythonPathFromReg = Path.Combine(Path.Combine(pythonDirectory, "ArcGIS" + shortVersion), "python.exe");
        if (File.Exists(pythonPathFromReg)) {
            pythonPath = pythonPathFromReg;
        }
    }
    return pythonPath;
}

पायथन के साथ एक डेस्कटॉप 10.1 मशीन पर, यह रिटर्न करता है C:\Python27\ArcGIS10.1\python.exe। पायथन के बिना एक डेस्कटॉप 10.1 मशीन पर, यह Python10.x कुंजी मौजूद नहीं होने के कारण InvalidOperationException उठाती है।

उम्मीद है कि यह आपकी मदद करता है जो आप वास्तव में पूरा करने की कोशिश कर रहे हैं, जो है - आश्चर्यजनक - अभी भी मेरे लिए स्पष्ट नहीं है।


7

पायथन निष्पादन योग्य की तलाश करने के बजाय, यह मदद विषय अपने स्थान को योग्य किए बिना बाहर जाने cmd.exeऔर चलने के लिए सुझाव देता है python.exe। हालाँकि, ध्यान दें कि यह काम करना चाहिए क्योंकि ArcGIS डेस्कटॉप इंस्टॉलर स्थापित होता है (संपादित करें: हाल ही में 10.1 पर परीक्षण किया गया है, यहpython.exe उपयोगकर्ता के PATHपर्यावरण चर में जोड़े जाने के पथ पर निर्भर नहीं करता है ।

एक और तरीका है एक स्क्रिप्ट टूल बनाना और उसे ArcObjects से निष्पादित करना

यदि आप वास्तव में ArcGIS के संस्करण के पथ के बाद हैं python.exe, तो ArcObjects + स्क्रिप्ट टूल दृष्टिकोण के विस्तार से, आप एक पायथन स्क्रिप्ट टूल बना सकते हैं जिसका एकमात्र आउटपुट का मान है sys.exec_prefix। यह फ़ोल्डर का पथ है जिसमें ArcGIS के पायथन के संस्करण हैं, उदा C:\Python27\ArcGIS10.1

साइड नोट : इन-प्रोसेस को चलाने के दौरान और नहीं sys.executableका रास्ता देता है, यही कारण है कि मैं उस चर का उपयोग करने का सुझाव नहीं देता हूं।ArcMap.exepython.exe

ArcObjects से स्क्रिप्ट टूल को कॉल करें और लौटे IGeoProcessorResultऑब्जेक्ट से आउटपुट प्राप्त करें ।

अपडेट: यहां एक नमूना आर्केपैम ऐड-इन प्रोजेक्ट (VS2010, .NET 3.5) है, जो ऐड-इन के अंदर पैक किए गए स्क्रिप्ट टूल का उपयोग करता है, जो बस python.exeआर्कपेक द्वारा उपयोग किए जाने वाले पथ को प्रदर्शित करता है : http://wfurl.com/cbd5091

यह सिर्फ एक बटन है जिसे आप क्लिक करते हैं और यह पथ के साथ एक संदेश बॉक्स को पॉप अप करता है:

बटन संदेश पात्र

कोड के दिलचस्प बिट्स:

  • पायथन लिपि:

    import sys
    import os
    import arcpy
    
    def getPythonPath():
        pydir = sys.exec_prefix
        pyexe = os.path.join(pydir, "python.exe")
        if os.path.exists(pyexe):
            return pyexe
        else:
            raise RuntimeError("No python.exe found in {0}".format(pydir))
    
    if __name__ == "__main__":
        pyexe = getPythonPath()
        arcpy.AddMessage("Python Path: {0}".format(pyexe))
        arcpy.SetParameterAsText(0, pyexe)
  • C # फ़ंक्शन:

    public string GetPythonPath()
    {
        // Build the path to the PythonPathToolbox
        string toolboxPath = Path.Combine(Path.GetDirectoryName(this.GetType().Assembly.Location), "PythonPath.tbx");
    
        // Initialize the geoprocessor.
        IGeoProcessor2 gp = new ESRI.ArcGIS.Geoprocessing.GeoProcessorClass();
    
        // Add the PythonPath toolbox.
        gp.AddToolbox(toolboxPath);
    
        // Need an empty array even though we have no input parameters
        IVariantArray parameters = new VarArrayClass();
    
        // Execute the model tool by name.
        var result = gp.Execute("GetPythonPath", parameters, null);
        return result.GetOutput(0).GetAsText();
    }

2
लेकिन यह दस्तावेज़ यह नहीं कहता है कि, ArcGIS डेस्कटॉप इंस्टॉलर उपयोगकर्ता के पथ पर्यावरण चर के लिए python.exe के लिए पथ सेट करता है। तो यह संभव हो सकता है कि अजगर का मार्ग पाथ पर्यावरण चर में नहीं है। तब यह एक त्रुटि पैदा करेगा। तो, मुझे कैसे यकीन हो सकता है कि अजगर निष्पादन योग्य पथ उपयोगकर्ता के पैठ पर्यावरण चर में है।
ईएमआई

2
आप जीवन की अधिकांश चीजों को पसंद नहीं कर सकते हैं और आप जो कुछ भी कर सकते हैं, उसकी सभी तरह की धारणाएं और आशा की चीजें काम कर सकती हैं, और उनके पास एक पतन योजना है जब वे नहीं करते हैं (इसे पाथ पर्यावरण चर में जोड़ने के निर्देश प्रदान करते हैं)। उस ने कहा, यदि यह एक सामान्य स्थापना है, तो मेरा मानना ​​है कि आर्कगिस डेस्कटॉप इंस्टॉलर उस पथ को पाथ पर्यावरण चर में जोड़ता है।
blah238

2
मैंने कई स्थापनाएं देखी हैं जहां आर्कगिस-स्थापित अजगर पथ में नहीं था। और क्या होगा अगर दो संस्करण स्थापित हैं और 'गलत' एक है?
अंधाधुंध

मैंने अपने तीसरे पैराग्राफ में एक समाधान पेश किया जो PATHपर्यावरण चर की परवाह किए बिना पाइथन के आर्किस की स्थापना को खोजने के लिए चाहिए ।
blah238

@ blah238 स्क्रिप्ट टूल नहीं बनाता है जो मेरे ऐड-इन को कम पोर्टेबल बनाता है या ऐड-इन की इंस्टॉलेशन प्रक्रिया को अन्य मशीन में मुश्किल बना देता है?
ईएमआई

6

क्या आपके पास रजिस्ट्री तक पहुंच होगी?

आर्कप को स्थापित करते समय यह पायथन को स्थापित करेगा यदि यह नहीं मिल सकता है। यह देखने के लिए रजिस्ट्री में दिखता है कि क्या पायथन पहले से स्थापित है। मेरा मानना ​​है कि इसके लिए मानक रजिस्ट्री स्थान है: कंप्यूटर \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath पथ स्थान की डिफ़ॉल्ट कुंजी के साथ (2.7 जा रहा है 10.1, 2.6, 10.0 से 10.0)

मैं एक कारण के बारे में सोच सकता हूं कि कब / क्यों इस कुंजी का मूल्य गलत होगा, लेकिन आप हमेशा इस तरह से जा सकते हैं: रजिस्ट्री के अंदर Esri \ Desktop हाइव एक पायथन स्थान है। इसका सरल मार्ग जो आपको मिल सकता है और फिर पाइथन ..exe है यह सुनिश्चित करने के लिए आगे के मार्ग बना सकते हैं। उदाहरण के लिए, 64 बिट मशीन पर कुंजी स्थापित हो जाती है: कंप्यूटर \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 PythonDir कुंजी और संबद्ध पथ मान के साथ

लेकिन मुझे @ blah238 उत्तर पसंद है। बस अपने प्रोग्राम से एक प्रॉम्प्ट खोलें और इसे वहां चलाएं। मैं एक कारण नहीं देख सकता कि यह क्यों काम नहीं करेगा।


2
यह दृष्टिकोण भी त्रुटिपूर्ण है क्योंकि कई पायथन इंस्टॉलेशन हो सकते हैं और आपके पास प्रोग्रामेटिक रूप से यह निर्धारित करने का कोई सीधा तरीका नहीं है कि आर्कजीआईएस द्वारा उपयोग किया जाने वाला कौन सा है। यदि आप चापलूसी नहीं कर रहे हैं तो यह बात नहीं हो सकती है। फिर भी, मुझे लगता है कि सबसे मजबूत समाधान में रजिस्ट्री और काफी तर्क शामिल होंगे। मैं हालांकि वहाँ नहीं जा रहा हूँ।
blah238

खैर तर्क को नवीनतम संस्करण 2.7 के साथ शुरू करना होगा और पीछे की ओर काम करना होगा। यह निश्चित रूप से विफल हो सकता है यदि आपने पायथन का एक नया संस्करण स्थापित किया है, तो आर्कजीआईएस के पुराने संस्करण को स्थापित किया और स्थापित किया जो कि पायथन के पुराने संस्करण को स्थापित करेगा। तो हाँ, मैं इस क्षमता से सहमत हूं, लेकिन इसकी संभावना नहीं है (या आप बस arc10.1 = py2.7, arc10.0 = py26 ... आदि की खोज कर सकते हैं) 100% सुनिश्चित हो। जैसा कि मैंने कहा, सबसे अच्छा तरीका शायद कमांड प्रॉम्प्ट को खोलना होगा।
काहेमा

@KHibma मैंने रजिस्ट्री के माध्यम से खोजा। लेकिन मुझे लगता है कि अगर मैं "PYTHON" कुंजी के माध्यम से देखता हूं तो यह वास्तव में परेशान है। मेरी मशीन में, दो पायथन संस्करण स्थापित हैं और यह दोनों को लौटाता है। मुझे लगता है, इसका एक अच्छा विचार "ईएसआरआई" कुंजी के माध्यम से देखना है और अगर सच्चे मूल्य के साथ "पायथन" उपकुंजी है, तो मैं "पायथनडियर" उपकुंजी मूल्य ले सकता हूं। यह मेरे मामले में काम करता है :)
Emi

क्या "ESRI" कुंजी के माध्यम से रजिस्ट्री में अजगर पथ की खोज करना गलत तरीका है? या क्या कोई मौका है कि, जिस तरह से esri रजिस्ट्री में कुंजी और मान बनाने के लिए उपयोग करता है वह बदल सकता है और कोड शायद इसे नहीं पढ़ सकता है
Emi

जब मैं रजिस्ट्री को "खोज" कहता हूं, तो मेरा मतलब है कि मेरे द्वारा दिए गए वास्तविक रास्तों का उपयोग करें। जब तक कोई बेहतर नहीं जानता है, ये reg कीज़ लोकेशन (रजिस्ट्री में) मशीन से मशीन में नहीं बदलेगी। तो आप बस यह देखने के लिए रास्ते को हार्डकोड करेंगे कि क्या कुंजियाँ मौजूद हैं, यदि ऐसा है तो मान क्या है ...
KHibma

5

[संपादित करें]set प्रोग्रामेटिक रूप से निष्पादित करते समय (नीचे मारा गया) मैंने जो चाहा था, उसे पर्यावरणीय रूप से उपयोग करके क्लीनर कोड के साथ और अधिक आसानी से पूरा किया जा सकता है ।

एक विकल्प सिस्टम पर प्रत्येक पर्यावरण चर को स्कैन करने और निम्नलिखित को साबित करने का प्रयास करना होगा:

1) पर्यावरण चर एक निर्देशिका है? (और यदि ऐसा है तो..)

2) क्या उस निर्देशिका में है python.exe?

मैं .net प्रोसेस एपीआई के माध्यम से कमांड निष्पादितset करके यह प्रोग्रामेटिक रूप से करने में सक्षम था । आदेश में, जब एक पैरामीटर के बिना इस्तेमाल किया, प्रणाली द्वारा उपयोग में सभी पर्यावरण चर देता है। इसलिए मैं पार्स कर सकता था, तब से उत्सर्जित STDOUT परिणामों को व्यवस्थित कर सकता था , और उन्हें स्क्रीन पर देख सकता था कि सिस्टम एन्वाइमेंट के माध्यम से जो भी (और मेरा मतलब है कि कुछ भी हो ) अंततः उपलब्ध है ।setsetpython.exe

से यह पेज पर चर्चा setआदेश:

सभी मौजूदा पर्यावरण चर को प्रदर्शित करने के लिए मापदंडों के बिना SET टाइप करें।

समझाने के लिए मैंने विधियों का एक संयोजन (और एक सहायक वर्ग ) लिखा था जो कि मैंने ऊपर चर्चा की थी। इन्हें ऑप्टिमाइज़ किया जा सकता है, और वे कुछ बुलेट-प्रूफिंग (Try..Catch, आदि) का उपयोग कर सकते हैं, लेकिन अगर कंप्यूटर में कोई पर्यावरण चर इंगित करने के लिए है python.exe, तो यह दृष्टिकोण इसे ढूंढना चाहिए! मुझे परवाह नहीं है अगर वर कहा जाता है PATH, ABBRACADABBRAया जो भी .. अगर यह की ओर इशारा करता python.exeहै, इस लिए यह खोजना चाहिए।

// C#, you'll need these using statements:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

यहाँ termsपर्यावरण चर के नाम, या उसके nमूल्यों (यानी PATHकई मान हो सकते हैं, लेकिन या तो अन्य संस्करणों में एक ही होगा) की तलाश करने के लिए आप पास-इन स्ट्रिंग्स का एक ऐरे हैं । सुनिश्चित करें कि सभी तार termsUPPERCASE हैं!

(जब मैंने इसका परीक्षण किया, तो मैंने बस "PYTHON" का उपयोग किया, जो C:\Python27\python.exeमेरे घर प्रणाली पर पाया गया। लेकिन आप इसे आसानी से विस्तारित कर सकते हैं यदि आप किसी भी python.exeउम्मीदवारों के मार्ग का निरीक्षण करना चाहते हैं, तो शर्तों का एक और तार [] शामिल कर सकते हैं --- उदाहरण, यह देखने के लिए कि क्या वे आर्कगिस बिन में थे, आदि)

// Top-level method that organizes everything below..
private void scrapeEnvironmentVariables(string[] terms)
{
    // !! ValueObject !! This is a Helper Class, find it at the bottom..
    List<ValueObject> voList = buildListOfEnvironmentObjects();

    foreach (ValueObject vo in voList)
    {
        bool candidateFound = ObjectMatchesSearchTerms(vo, terms);

        if (candidateFound)
        {    
            string exeCandidate = "";
            foreach (string unlikelyPath in vo.values)
            {
                if (Directory.Exists(unlikelyPath))
                {
                    string unlikelyExe = unlikelyPath + "\\python.exe";
                    if(File.Exists(unlikelyExe))
                        exeCandidate = unlikelyExe;
                }

                if (exeCandidate != "")
                {
                    break;
                    // At this point, exeCandidate is a fully-qualified
                    // path to python.exe..
                }
            }

            // If you only want the first hit, break here..
            // As-is, the code will look for even more matches.
            //if (breakOnFirstHit)
            //    break;
        }
    }
}


// Execute Environment.GetEnvironmentVariables() and organize the 
// key..value pairs into 1:n ValueObjects (see Helper Class below).
private List<ValueObject> buildListOfEnvironmentObjects()
{
    // Return a List of 1:n key..value objects.
    List<ValueObject> voList = new List<ValueObject>();

    IDictionary variableDictionary = Environment.GetEnvironmentVariables();
    foreach (DictionaryEntry entry in variableDictionary)
    {
        // Explode multi-values into a List of values (n).
        List<string> values = new List<string>();
        string[] rawValues = ((string)entry.Value).Split(';');
        foreach (string value in rawValues)
            if (value != "") values.Add(value.ToUpper());

        ValueObject valueObject = new ValueObject();
        valueObject.key = ((string)entry.Key).ToUpper();
        valueObject.values = values.ToArray();

        voList.Add(valueObject);
    }
    return voList;
}


// Compare the key and any value(s) in a ValueObject with all the
// terms submitted to the top-level method. If **ALL** the terms
// match (against any combination of key..value), it returns true.
private bool ObjectMatchesSearchTerms(ValueObject vo, string[] terms)
{
    int matchCount = 0;

    foreach (string term in terms)
    {
        if (vo.key.Contains(term))              // screen the key
            matchCount++;

        foreach (string value in vo.values)     // screen N values
        {
            if (value.Contains(term))
                matchCount++;
        }
    }

    // Test against >= because it's possible the match count could
    // exceed the terms length, like if a match occurred in both the
    // key and the value(s). So >= avoids omiting that possibility.
    return (matchCount >= terms.Length) ? true : false;
}    

और मेरे मुख्य वर्ग के निचले हिस्से में, मैंने निम्नलिखित हेल्पर क्लास को शामिल किया :

class ValueObject : Object
{
    public ValueObject() { } // default constructor

    public string key;
    public string[] values;
}

1
यह नाजुक है, क्योंकि उपयोगकर्ता ArcGIS डेस्कटॉप इंस्टॉलर में पायथन इंस्टॉलेशन डायरेक्टरी को कस्टमाइज़ कर सकता है। इसके अलावा PYTHONPATHचर वह नहीं है जो आप चाहते हैं।
blah238

@ blah238, कभी-कभी नाजुक आप सभी को मिला है। मैं वास्तव में यह देखकर हैरान था कि आर्क ने PYTHONPATH के खिलाफ वायर्ड-अप किया था। यह एक डिफ़ॉल्ट 9.2 स्थापित है। फिर भी, ओपी ने पूछा कि कैसे प्रोग्रामिक रूप से ArcGIS python.exe को प्राप्त किया जाए, और जिस दृष्टिकोण की मैंने सिफारिश की है, वह नाजुक या नहीं।
इलाबिस

कह नहीं सकता कि मैं नीचे-वोट को समझता हूं, क्या यह जवाब वास्तव में " उपयोगी नहीं है "? यह भयानक नहीं हो सकता है , लेकिन यह निश्चित रूप से एक विकल्प है, शायद एक विशिष्ट आर्क स्थापित के लिए काम करेगा, और बहुत कम से कम, यह थ्रेड के लिए कुछ सहायक जोड़ता है - विशेष रूप से, यह एक डिफ़ॉल्ट आर्क स्थापित करता है जो अपने अजगर को जोड़ने के लिए चयन करता है। के अलावा अन्य पर्यावरण चर के साथ exe PATH
एलोब्रिस

क्षमा करें, लेकिन आप गलत हैं। PYTHONPATH चर का उपयोग पायथन द्वारा मॉड्यूल खोजने के लिए किया जाता है , न कि ArcGIS द्वारा पायथन को खोजने के लिए। लिंक की जाँच करें।
blah238

@ blah238, मुझे लगता है कि स्क्रीनशॉट मुझे भारी पड़ रहा था / उस बिंदु को अस्पष्ट कर रहा था जिसे मैं बनाने की कोशिश कर रहा था। (विशेष रूप से, ओपी को मेरा सुझाव जोर देने का इरादा नहीं था PYTHONPATH, कि बस उस विशेष सिस्टम पर एकमात्र संस्करण हुआ जो वापस इंगित करता है python.exe।) वैसे भी, मैंने अपने जवाब को एक कार्यशील सी # कोड उदाहरण में शामिल करने के लिए ओवरहॉल किया, और मैं सराहना करूंगा। यह जानना कि क्या आप अभी भी इस दृष्टिकोण से असहमत हैं। धन्यवाद / ई।
एलोबिस

4

मैं ऊपर दिए गए प्रश्न में मेरी टिप्पणी के आधार पर एक वैकल्पिक समाधान प्रस्तुत करना चाहता हूं। एक वर्तमान परियोजना के लिए, मैं बहुत कुछ समान कर रहा हूं; मेरे पास .NET एड-इन है, जब उपयोगकर्ता ArcMap UI में एक बटन पर क्लिक करता है, पायथन स्क्रिप्ट चलती है। मैंने एक पैथ पर्यावरण वैरिएबल को आर्किज पायथन के लिए एक आवश्यकता के अनुरूप बनाया है, इस तरह मुझे वास्तव में अपने .NET कोड में पायथन एक्सई के लिए पथ सहित चिंता करने की आवश्यकता नहीं है।

अब, जबकि विकास में, परीक्षक केवल पाथ चर को मैन्युअल रूप से सेट कर रहे हैं। लेकिन मेरे पास अंततः एक विंडोज इंस्टॉलर (एक्सई) होगा जो ऐड-इन को स्थापित करेगा, किसी भी पायथन निर्भरता को स्थापित करेगा, और किसी भी आवश्यक पैथ चर को सेट करेगा। इसके लिए, मैं विंडोज इंस्टालर्स बनाने के लिए एक ओपन सोर्स सिस्टम Nullsoft Scriptable Install System (NSIS) का उपयोग कर रहा हूं । यहाँ कुछ कोड है जो मैंने अभी तक काम किया है, जो कि काफी कठिन है। मूल रूप से, यह देखने के लिए रजिस्ट्री में दिखता है कि क्या ब्याज के पैथ चर हैं, और यदि वे ऐसा नहीं करते हैं तो उन्हें जोड़ता है। व्यवस्थापक के रूप में चलाया जाना है, ज़ाहिर है।

include "StrFunc.nsh"
!include "LogicLib.nsh"

/*
  Name: VIESORE_Installer.nsi
  Author: Chad Cooper, CAST
  Date: 7/16/2012
  Purpose: NSIS installer script for .exe creation by NSIS. Installs VIESORE components and sets up environment.
*/

Name "VIESORE"
Caption "VIESORE Installer"
Outfile "VIESOREInstaller.exe"

RequestExecutionLevel admin

# Initialize functions
${StrLoc}
# Initialize user variables
Var path

Section "Set SYSTEM PATH environmental variables"
    ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
    ${StrLoc} $1 $0 "C:\Python26\ArcGIS10.0" ">"
    ${StrLoc} $2 $0 "C:\Python26\ArcGIS10.0\Scripts" ">"
        ${StrLoc} $3 $0 "C:\Python26\ArcGIS10.0\Lib\site-packages" ">"
        ${StrLoc} $4 $0 "C:\Program Files\e-on software\Vue 10 Infinite\Application" ">"
        # Test to see if env vars exist in current system PATH, if not add them to $path variable
        ${If} $3 == ""
                StrCpy $path "C:\Python26\ArcGIS10.0\Lib\site-packages"
        ${EndIf}
        ${If} $2 == ""
                StrCpy $path "C:\Python26\ArcGIS10.0\Scripts;$path"
        ${EndIf}
        ${If} $1 == ""
                StrCpy $path "C:\Python26\ArcGIS10.0;$path"
        ${EndIf}
        ${If} $4 == ""
                StrCpy $path "C:\Program Files\e-on software\Vue 10 Infinite\Application;$path"
        ${EndIf}
        DetailPrint "$path written to system PATH"
    WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$path"
    ReadRegStr $5 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
    DetailPrint "New Path: $5"
SectionEnd

तो, फिर से, यह ArcGIS पायथन एक्स के लिए रास्ता नहीं खोजता है, लेकिन यह आपको अपने अंतिम उपयोगकर्ता को इसे ठीक से और आसानी से सेट करने की शक्ति देता है।


+1 मैं इस सिफारिश से पूरी तरह सहमत हूं --- जहां उच्च-स्तर पर, चाड कह रहा है "आर्क के अजगर उदाहरण को कम करने के लिए समस्या को पीछे न छोड़ें, बल्कि एक इंस्टॉलर का उपयोग करें और सही python स्थापित करने के लिए इसे SysAdmin पर छोड़ दें।" उदाहरण। " @ChadCooper, क्या NSIS आपको कोई UI नियंत्रण देता है ताकि आप उन डिफ़ॉल्ट रास्तों को ओवरराइड कर सकें जो आप चुनते हैं? मैं कोड द्वारा निहित नहीं देख रहा हूं, लेकिन मैं शर्त लगा रहा हूं कि यह वहां है।
एलक्रोबिस

@elrobis - मुझे यकीन है कि आप मौजूदा लोगों को ओवरराइड / एडिट / बदल सकते हैं - NSIS बहुत ही कॉन्फ़िगर करने योग्य है और इससे आप एक बहुत चालाक इंस्टॉलर का निर्माण कर सकते हैं - आप इसे लिखने के लिए कोड का पता लगा सकते हैं।
चाड कूपर

ऐड-इन के लिए एक इंस्टॉलर बनाना थोड़ा पागल सा लगता है। इसके अलावा, 10.1, 10.2 आदि के साथ-साथ 10.0 का समर्थन करने के लिए आपको किन संशोधनों की आवश्यकता होगी?
blah238

@ blah238 - हाँ, यह पागल लगता है, लेकिन इस विशेष परियोजना के लिए मेरा इंस्टॉलर बहुत कुछ कर रहा है, जैसा कि एक बात है। मेरा ऐड-इन 10.0 के लिए सख्ती से है। मुझे लगता है कि आप क्या संस्करण स्थापित किया गया है यह देखने के लिए रजिस्ट्री के विभिन्न संस्करणों के लिए अनुमान लगा सकते हैं, फिर उसके अनुसार कार्य करें।
चाड कूपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.