Kiểm tra xem tập lệnh python có được chạy từ ArcGIS (arcmap hoặc trên máy chủ) hoặc tập lệnh python độc lập không


8

Đối với mục đích gỡ lỗi, tôi đã tạo một điều kiện mã hóa cứng để kiểm tra nó, tập lệnh được chạy độc lập hoặc như một công cụ ArcGIS. Có cách nào để loại bỏ điều này trong thời gian chạy? ví dụ một số biến môi trường, biến toàn cục, v.v.

ví dụ

dryRun= 1
if dryRun:
    par= 'Hello'
else:
    par= arcpy.GetParameterAsText(0)
# Do something

Câu trả lời:


19

Kiểm tra sys.executable.

Trong cửa sổ Python:

>>> import sys
>>> sys.executable
'C:\\Program Files (x86)\\ArcGIS\\Desktop10.2\\bin\\ArcMap.exe'

và sau đó trong Python.exe:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'C:\\Python27\\ArcGIS10.2\\python.exe'

Vì vậy, một đơn giản if os.path.basename(sys.executable).lower() == 'python.exe'nên làm điều đó.


Cảm ơn, nhưng mục tiêu chính của tôi là kiểm tra giữa chạy cục bộ so với chạy máy chủ (nghĩa là dịch vụ xử lý địa lý - tôi nghĩ đó là tên)
Mahdi

Tôi tin rằng đó sys.executablesẽ là một cái gì đó khác biệt khi chạy như một công cụ máy chủ. Viết một kịch bản thử nghiệm có vấn đề arcpy.AddMessage("Executable: " + sys.executable)để xác nhận.
Jason Scheirer

1

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn kiểm tra xem bạn có đang chạy tập lệnh như một công cụ tập lệnh hay không. Nếu nó đang chạy như một công cụ tập lệnh, bạn muốn đặt một số biến bằng GetParameterAsText và nếu nó đang chạy dưới dạng độc lập, bạn muốn sử dụng một số biến được mã hóa cứng, điều này có đúng không? Nếu vậy, bạn có thể làm như sau:

if len(sys.argv) > 1:
    #Assign input and output parameters for script tool
    par = arcpy.GetParameterAsText(0)
else:
    # Hard coded parameters for testing
    par = 'Hello'

Bằng cách kiểm tra độ dài của sys.argv, bạn đang xác định có bao nhiêu tham số được truyền cho tập lệnh. Luôn có ít nhất một tham số (vị trí của chính tập lệnh), vì vậy nếu có nhiều hơn một tham số được thông qua, bạn có thể giả sử rằng ArcGIS đang gửi chúng (trừ khi bạn tình cờ chuyển các đối số từ một nơi khác).


tốt, loại này hoạt động ngay bây giờ b / c Tôi không vượt qua các đối số nhưng có cách nào "thanh lịch" hơn không?
Mahdi

Nếu thanh lịch, bạn có nghĩa là ngắn hơn, bạn có thể làm cho nó một lớp lót như vậy:par = arcpy.GetParameterAsText(0) if len(sys.argv) > 1 else 'Hello'
Paul

bởi "Elegant" tôi có nghĩa là một cái gì đó như kiểm tra một biến môi trường, vv Không "tao nhã" theo nghĩa trăn. BTW, trong khi tôi sử dụng cấu trúc này cho bản thân mình rất nhiều, trong trường hợp chúng ta đang thảo luận, rất có thể chúng ta sẽ đặt nhiều thông số cho tập lệnh, do đó, các đoạn ngắn sẽ không thực sự thanh lịch.
Mahdi

0

Một cách đơn giản để làm điều đó sẽ như thế này:

import arcpy
par = arcpy.GetParameterAsText(0)
if not par: #If no parameter has been passed, an empty string is returned
  par = 'Hello'

Tôi đã không thử nó trước đây, nhưng tôi nghĩ rằng nó sẽ đưa ra một ngoại lệ, điều này thực sự thú vị ... tuy nhiên, nó sẽ không cho phép tôi tua lại một phần logic mã dựa trên độc lập so với công cụ.
Mahdi

Bạn cần thay đổi gì khác ngoài các tham số nếu tập lệnh được chạy từ bên ngoài ArcMap?
Paul
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.