Làm cách nào để tôi có thể lập trình đường dẫn của Python Python.exe, được sử dụng bởi ArcMap


15

Tôi đang làm việc với một bổ trợ của ArcMap trong C #. Từ mã C #, tôi đã thực thi một số tập lệnh Python. Bây giờ, để chạy các script đó, tôi có đường dẫn python được mã hóa cứng. Nhưng đây không phải là di động. Vì vậy, tôi muốn lấy đường dẫn của Python thực thi từ mã và sử dụng nó.

Câu hỏi:

Làm cách nào tôi có thể nhận được đường dẫn của tệp thực thi Python được ArcMap sử dụng từ mã C #?

BIÊN TẬP :

Từ đề xuất của bạn, hiện tại tôi đang sử dụng "môi trường đường dẫn" để lấy đường dẫn Python.

//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;
        }
    }
}

Nhưng có một vấn đề:

Khi phiên bản khác nhau của python được cài đặt trong máy của tôi, không có gì đảm bảo rằng, "python.exe" tôi đang sử dụng, ArcGIS cũng sử dụng nó.

Tôi không đánh giá cao việc sử dụng một công cụ khác để có đường dẫn "python.exe" . Vì vậy, tôi thực sự nghĩ rằng nếu có bất kỳ cách nào để có được đường dẫn từ khoá đăng ký. Đối với sổ đăng ký "ArcGIS10.0" trông giống như: nhập mô tả hình ảnh ở đây

Và vì điều đó, tôi đang suy nghĩ về cách làm theo con đường:

//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 ;
}

Nhưng trước khi sử dụng thủ tục thứ hai, tôi cần chắc chắn về dự đoán của mình. Đoán là:

  1. "Đúng" được liên kết với python có nghĩa là python được cài đặt với ArcGIS
  2. ArcGIS 10.0 và khóa đăng ký của phiên bản trên sẽ được viết theo cùng một quy trình.

Xin hãy giúp tôi để có được bất kỳ làm rõ về dự đoán của tôi.


5
Bạn đã xem xét việc tạo một công cụ kịch bảnthực thi nó từ ArcObjects chưa?
blah238

3
Bạn có thể không chỉ có một biến môi trường PATH được đặt thành exe ArcGIS Python là một yêu cầu cài đặt cho Bổ trợ của bạn không?
Chad Cooper

Tất cả đã nói, suy nghĩ của @ ChadCooper phải là cách tốt nhất. Thay vì cố gắng làm việc ngược, chỉ cần đặt nó một lần và mãi mãi trong thời gian cài đặt.
elrobis

@elrobis: Tôi biết, thiết lập đường dẫn trong môi trường PATH là một cách tốt. Nhưng tôi muốn biết liệu có cách nào để tìm con trăn và làm mọi thứ mà không làm gián đoạn người dùng.
Emi

@ blah238 cảm ơn lời đề nghị của bạn. Tôi không bao giờ làm việc với công cụ kịch bản. Có thể tôi cần tìm hiểu về nó
Emi

Câu trả lời:


2

Tôi lấy ví dụ mã thứ hai của bạn, làm cho nó hoạt động trên cả hai hệ điều hành 64 và 32 bit và đơn giản hóa nó một chút. Hoạt động với tôi ở mức 10.1 trên Windows 7 64 bit, nhưng rõ ràng bạn nên kiểm tra nó trên càng nhiều môi trường càng tốt và thêm lại vào bất kỳ kiểm tra lập trình phòng thủ nào bạn nghĩ là cần thiết.

Sau khi thử nghiệm ArcGIS Desktop 10.1 cài đặt sạch mà không có Python, tôi thấy rằng nó không bao gồm khóa con Python10.x, chứ đừng nói đến giá trị True / false "Python" (vẫn không chắc đó là gì, có thể liên hệ với bộ phận hỗ trợ ESRI nếu bạn phải biết rôi).

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;
}

Trên máy tính để bàn 10.1 với Python, điều này trả về C:\Python27\ArcGIS10.1\python.exe. Trên máy tính để bàn 10.1 không có Python, điều này làm tăng một UnlimitedOperationException do không có khóa Python10.x.

Hy vọng rằng điều này sẽ giúp bạn với bất cứ điều gì bạn đang cố gắng thực hiện, điều này - thật đáng kinh ngạc - vẫn chưa rõ ràng với tôi.


7

Thay vì tìm kiếm Python thực thi, chủ đề trợ giúp này gợi ý tách ra cmd.exevà chạy python.exemà không đủ điều kiện vị trí của nó. Tuy nhiên, xin lưu ý rằng điều này sẽ hoạt động vì trình cài đặt ArcGIS Desktop thiết lập (chỉnh sửa: gần đây đã thử nghiệm ở 10.1, không được) phụ thuộc vào đường dẫn python.exeđược thêm vào PATHbiến môi trường của người dùng .

Một cách tiếp cận khác là tạo ra một công cụ script thực thi nó từ ArcObjects .

Nếu bạn thực sự theo đường dẫn đến phiên bản của ArcGIS python.exe, bằng cách mở rộng phương pháp tiếp cận công cụ tập lệnh ArcObjects +, bạn có thể tạo một công cụ tập lệnh Python có đầu ra duy nhất là giá trị sys.exec_prefix. Đây là đường dẫn của thư mục chứa phiên bản Python của ArcGIS, vd C:\Python27\ArcGIS10.1.

Lưu ý bên : sys.executabletrả về đường dẫn đếnArcMap.exe và KHÔNG python.exekhi chạy trong tiến trình, đó là lý do tại sao tôi không đề xuất sử dụng biến đó.

Gọi công cụ script từ ArcObjects và nhận đầu ra từ trả về IGeoProcessorResult đối tượng được .

Cập nhật: Dưới đây là một dự án bổ trợ ArcMap mẫu (VS2010, .NET 3.5) sử dụng một công cụ tập lệnh được đóng gói trong bổ trợ chỉ đơn giản hiển thị đường dẫn đếnpython.exe ArcMap được sử dụng: http://wfurl.com/cbd5091

Đó chỉ là một nút bạn nhấp và nó bật lên một hộp thông báo với đường dẫn:

Cái nút Hộp tin nhắn

Các bit thú vị của mã:

  • Tập lệnh Python:

    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)
  • Hàm 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
Nhưng tài liệu này không nói rằng, trình cài đặt ArcGIS Desktop thiết lập đường dẫn đến python.exe đến biến môi trường PATH của người dùng. Vì vậy, có thể đường dẫn của python không nằm trong biến môi trường PATH. Sau đó, nó sẽ tạo ra một lỗi. Vì vậy, làm thế nào tôi có thể chắc chắn rằng đường dẫn thực thi của python nằm trong biến môi trường PATH của người dùng.
Emi

2
Bạn không thể, giống như hầu hết mọi thứ trong cuộc sống và tính toán tất cả những gì bạn có thể làm là đưa ra các giả định và hy vọng mọi thứ hoạt động, và có kế hoạch dự phòng khi chúng không (cung cấp hướng dẫn về cách thêm nó vào biến môi trường PATH). Điều đó nói rằng, nếu đó là một cài đặt bình thường, tôi tin rằng trình cài đặt ArcGIS Desktop sẽ thêm đường dẫn đó đến biến môi trường PATH.
blah238

2
Tôi đã thấy nhiều cài đặt trong đó con trăn cài đặt arcgis không có trong đường dẫn. Và nếu có hai phiên bản được cài đặt và một phiên bản 'sai' nằm trong đường dẫn thì sao?
Blindjlie

Tôi đã đưa ra một giải pháp trong đoạn thứ 3 của mình rằng phải tìm cài đặt Python của ArcGIS bất kể PATHbiến môi trường.
blah238

@ blah238 không tạo công cụ tập lệnh làm cho bổ trợ của tôi ít di động hơn hoặc làm cho quá trình cài đặt bổ trợ cho máy khác trở nên khó khăn?
Emi

6

Bạn sẽ có quyền truy cập vào sổ đăng ký?

Khi cài đặt ArcMap, nó sẽ cài đặt Python nếu không thể tìm thấy nó. Nó nhìn vào sổ đăng ký để xem Python đã được cài đặt chưa. Tôi tin rằng vị trí đăng ký tiêu chuẩn cho việc này là: máy tính \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Với Khóa mặc định của vị trí Đường dẫn (2.7 là 10.1, 2.6 là 10.0)

Tôi không thể nghĩ ra lý do khi / tại sao giá trị của khóa này không chính xác, nhưng bạn luôn có thể đi theo cách này: Bên trong tổ hợp Esri \ Desktop của sổ đăng ký là một vị trí Python. Đó là đường dẫn đơn giản mà bạn có thể nhận được và sau đó xây dựng các đường dẫn tiếp theo để đảm bảo có Python.exe. Ví dụ: khóa trên máy 64 bit được cài đặt vào: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 Với khóa PythonDir và giá trị Đường dẫn liên quan

Nhưng tôi thích câu trả lời @ blah238. Chỉ cần mở một dấu nhắc từ chương trình của bạn và chạy nó ở đó. Tôi không thể thấy một lý do tại sao điều này sẽ không hoạt động.


2
Cách tiếp cận này cũng rất thiếu sót vì có thể có nhiều cài đặt Python và bạn không có cách đơn giản nào để xác định theo chương trình, cái nào được sử dụng bởi ArcGIS. Nếu bạn không chạy Arcpy thì điều này có thể không quan trọng. Tuy nhiên, tôi nghĩ rằng giải pháp mạnh mẽ nhất sẽ liên quan đến đăng ký và khá nhiều logic. Tôi sẽ không đi đến đó mặc dù.
blah238

Vâng, logic sẽ phải bắt đầu với phiên bản 2.7 mới nhất và hoạt động ngược. Điều này tất nhiên có thể thất bại nếu bạn cài đặt phiên bản Python mới, sau đó đã cài đặt phiên bản ArcGIS cũ hơn để cài đặt phiên bản Python cũ hơn. Vì vậy, vâng, tôi đồng ý với tiềm năng này, nhưng nó không có khả năng (hoặc bạn chỉ có thể xây dựng một tra cứu arc10.1 = py2.7, arc10.0 = py26 ... vv để chắc chắn 100%). Như tôi đã nói, phương pháp tốt nhất có lẽ chỉ cần trình bày ra dấu nhắc lệnh.
KHibma

@KHibma Tôi đã tìm kiếm thông qua sổ đăng ký. Nhưng tôi nghĩ nó thực sự gây phiền nhiễu nếu tôi xem qua phím "PYTHON". Trong máy của tôi, có hai phiên bản python được cài đặt và nó trả về cả hai. Tôi nghĩ rằng, nên xem qua khóa "ESRI" và nếu có khóa con "Python" có giá trị thực, thì tôi có thể lấy giá trị khóa con "PythonDir". Nó hoạt động trong trường hợp của tôi :)
Emi

Đây có phải là một cách sai để tìm kiếm đường dẫn python trong registry thông qua khóa "ESRI" không? Hoặc có bất kỳ cơ hội nào, cách esri sử dụng để tạo khóa và giá trị trong sổ đăng ký có thể thay đổi và mã có thể không đọc được
Emi

Khi tôi nói "tìm kiếm" sổ đăng ký, tôi có nghĩa là sử dụng các đường dẫn thực tế tôi đã cung cấp ở trên. Trừ khi ai đó biết rõ hơn, các vị trí khóa reg này (trong sổ đăng ký) sẽ không thay đổi từ máy này sang máy khác. Vì vậy, bạn chỉ cần mã hóa các đường dẫn để xem các khóa có tồn tại ở đó không, nếu có thì giá trị là gì ...
KHibma

5

[Chỉnh sửa] Trong khi thực hiện setlập trình (đánh ra, bên dưới) đã làm những gì tôi muốn, nó có thể được thực hiện dễ dàng hơn và với mã sạch hơn bằng cách sử dụng Môi trường.GetEn môiVariabled () .

Một tùy chọn sẽ là quét mọi Biến môi trường trên hệ thống và cố gắng chứng minh các điều sau:

1) Giá trị biến môi trường có phải là thư mục không? (và nếu như vậy..)

2) Thư mục đó có chứa python.exekhông?

Tôi đã có thể thực hiện việc này bằng lập trình bằng cách thực thi setlệnh thông qua API .Net Process API . Các setlệnh, khi được sử dụng mà không có một tham số, trả về tất cả các biến môi trường trong sử dụng bởi hệ thống. Vì vậy, tôi có thể parase, sau đó tổ chức các kết quả STDOUT được phát ra từ đó set, và sàng lọc chúng để xem liệu có bất cứ điều gì (và ý tôi là BẤT CỨ ) có sẵn thông qua việc hình dung hệ thống cuối cùng đã chỉ ra python.exe.

Từ trang này thảo luận về setlệnh:

Nhập SET không có tham số để hiển thị tất cả các biến môi trường hiện tại.

Để minh họa tôi đã viết một sự kết hợp của các phương thức (và một lớp trợ giúp ) thực hiện những gì tôi đã thảo luận ở trên. Chúng có thể được tối ưu hóa và chúng có thể sử dụng một số tính năng chống đạn (Try..Catch, v.v.), nhưng nếu máy tính có BẤT K Var Biến môi trường nào python.exe, thì phương pháp này sẽ tìm thấy nó! Tôi không quan tâm nếu var được gọi PATH, ABBRACADABBRAhoặc bất cứ điều gì .. nếu nó trỏ tới python.exe, điều này sẽ tìm thấy nó.

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

Dưới đây termslà một chuỗi các chuỗi mà bạn truyền vào thường trình để tìm trong tên của biến môi trường hoặc các ngiá trị của nó (nghĩa là PATHcó thể có một vài giá trị, nhưng hầu hết các vars khác sẽ chỉ có một). Hãy chắc chắn rằng tất cả các chuỗi trong termsUPPERCASE!

(Khi tôi kiểm tra điều này, tôi chỉ sử dụng "PYTHON", được tìm thấy C:\Python27\python.exetrên hệ thống nhà của tôi. Nhưng bạn có thể dễ dàng mở rộng nó để bao gồm một chuỗi [] điều khoản khác nếu bạn muốn kiểm tra thêm đường dẫn của bất kỳ python.exeứng cử viên nào được trả lại --- cho ví dụ, để xem chúng có trong thùng ArcGIS không, v.v.)

// 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;
}    

Và ở cuối lớp chính của tôi, tôi đã bao gồm Lớp người trợ giúp sau :

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

    public string key;
    public string[] values;
}

1
Điều này rất dễ hỏng, vì người dùng có thể tùy chỉnh thư mục cài đặt Python trong trình cài đặt ArcGIS Desktop. Ngoài ra PYTHONPATHbiến KHÔNG phải là cái bạn muốn.
blah238

@ blah238, đôi khi mong manh là tất cả những gì bạn có. Tôi thực sự ngạc nhiên khi thấy Arc nối dây với PYTHONPATH. Đó là cài đặt mặc định 9.2. Tuy nhiên, OP đã hỏi làm thế nào để lập trình đến python.exe ArcGIS và cách tiếp cận tôi khuyên dùng, có dễ vỡ hay không, có thực hiện được điều đó không.
elrobis

Không thể nói tôi hiểu việc bỏ phiếu, câu trả lời này có thực sự " không hữu ích " không? Nó có thể không tuyệt vời , nhưng chắc chắn đó là một tùy chọn, có thể sẽ hoạt động cho một cài đặt Arc điển hình, và ít nhất, nó bổ sung một cái gì đó hữu ích cho luồng - cụ thể, nó minh họa một cài đặt Arc mặc định chọn liên kết với con trăn của nó. exe với một biến môi trường khác hơn PATH.
elrobis

Xin lỗi nhưng bạn không chính xác. Biến PYTHONPATH được Python sử dụng để tìm các mô-đun, không phải bởi ArcGIS để tìm Python. Kiểm tra các liên kết.
blah238

@ blah238, tôi nghĩ rằng ảnh chụp màn hình là quá lớn / che khuất điểm tôi đang cố gắng thực hiện. (Cụ thể, đề xuất của tôi với OP không có ý định nhấn mạnh PYTHONPATH, đó chỉ là var duy nhất trên hệ thống cụ thể đó quay trở lại python.exe.) biết nếu bạn vẫn không đồng ý với phương pháp này. Cảm ơn / E.
elrobis

4

Tôi muốn đưa ra một giải pháp thay thế, dựa trên nhận xét của tôi trong câu hỏi trên. Đối với một dự án hiện tại, tôi đang làm một cái gì đó rất giống nhau; Tôi có một Bổ trợ .NET, khi người dùng nhấp vào nút trong Giao diện người dùng ArcMap, tập lệnh Python sẽ chạy. Tôi đã yêu cầu một biến môi trường PATH được đặt thành ArcGIS Python có thể thực thi được theo yêu cầu, theo cách đó tôi không thực sự phải lo lắng về việc bao gồm đường dẫn đến exe Python trong mã .NET của tôi.

Bây giờ, trong khi đang phát triển, người kiểm tra chỉ thiết lập biến PATH bằng tay. Nhưng cuối cùng tôi sẽ có một trình cài đặt Windows (exe) được tạo để cài đặt Bổ trợ, cài đặt bất kỳ phụ thuộc Python nào và đặt bất kỳ biến PATH cần thiết nào. Đối với điều này, tôi đang sử dụng Hệ thống cài đặt tập lệnh Nullsoft (NSIS) , một hệ thống nguồn mở để tạo các trình cài đặt Windows. Đây là một số mã mà tôi đã làm việc cho đến nay, khá thô. Về cơ bản, nó nhìn vào sổ đăng ký để xem các biến quan tâm của PATH có ở đó không và liệu chúng có bổ sung chúng không. Tất nhiên phải được điều hành với tư cách quản trị viên.

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

Vì vậy, một lần nữa, điều này không tìm thấy đường dẫn đến exe ArcGIS Python, nhưng nó cho phép bạn cung cấp cho người dùng cuối của bạn sức mạnh để đặt nó đúng cách và dễ dàng.


+1 Tôi hoàn toàn đồng ý với khuyến nghị này --- ở cấp độ cao, Chad đang nói rằng "đừng giải quyết vấn đề lạc hậu để suy luận về trường hợp trăn của Arc, thay vào đó hãy sử dụng trình cài đặt và để SysAdmin thiết lập con trăn chính xác ví dụ. " @ChadCooper, NSIS có cung cấp cho bạn bất kỳ điều khiển UI nào để bạn có thể ghi đè các đường dẫn mặc định đó nếu bạn chọn không? Tôi không thấy điều đó ngụ ý bởi mã nhưng tôi cá là nó ở đó.
elrobis

@elrobis - Tôi cá là bạn có thể ghi đè / chỉnh sửa / thay đổi những cái hiện có - NSIS rất có thể cấu hình và có thể cho phép bạn xây dựng một trình cài đặt đẹp mắt - bạn chỉ cần tìm ra mã để viết nó.
Chad Cooper

Tạo một trình cài đặt cho một bổ trợ có vẻ hơi điên rồ. Ngoài ra, những sửa đổi nào bạn cần thực hiện để hỗ trợ 10.1, 10.2, v.v. cũng như 10.0?
blah238

@ blah238 - vâng, nó có vẻ điên rồ, nhưng trình cài đặt của tôi cho dự án cụ thể này sẽ còn làm được nhiều hơn thế, như đã nói. Bổ trợ của tôi hoàn toàn phù hợp với 10.0. Tôi đoán đối với các phiên bản ArcGIS khác nhau, bạn có thể kiểm tra sổ đăng ký để xem phiên bản nào được cài đặt, sau đó hành động tương ứng.
Chad Cooper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.