Hướng dẫn python pass arguments to module - python truyền đối số cho mô-đun

  • Tất cả các cộng đồng
  • Ý tưởng ArcGIS
  • Cơ bản cộng đồng

  • Nhà
  • Tất cả các cộng đồng
  • Nhà phát triển
  • Python
  • Câu hỏi Python
  • Làm thế nào để chuyển các đối số cho chức năng chính trong mô -đun?

Tùy chọn

  • Đăng ký nguồn cấp dữ liệu RSS
  • Đánh dấu chủ đề là mới
  • Đánh dấu chủ đề như đã đọc
  • Nổi chủ đề này cho người dùng hiện tại
  • Đánh dấu
  • Đặt mua
  • Tắt tiếng
  • Trang thân thiện với máy in

Gần đây tôi đã bắt đầu tìm hiểu thêm về các gói và mô -đun Python. Tôi hiện đang bận cập nhật các mô -đun hiện có của mình để có thể chạy dưới dạng tập lệnh hoặc được nhập dưới dạng mô -đun vào mã khác của tôi. Tôi không chắc làm thế nào để xây dựng các đối số đầu vào của mình trong mô -đun của tôi và chuyển chúng đến hàm chính () trong mô -đun của tôi.

Tôi đã viết hàm Main () của tôi và gọi nó theo nếu __name__ == '__main__' chuyển các đối số đầu vào. Các đầu vào hiện được mã hóa cứng để hiển thị những gì tôi đang cố gắng đạt được. Bất kỳ trợ giúp nào trong cách xây dựng chính xác các đối số đầu vào của tôi mà người dùng sẽ vượt qua, sau đó sẽ được truyền vào chức năng chính sẽ được đánh giá cao.main() function and called it under if __name__ == '__main__' passing the input arguments. The inputs are currently hard coded to show what I'm trying to achieve. Any help in how to correctly construct my input arguments that the user will pass, which will then be passed onto the main function will be appreciated.

Như đã đề cập, tôi đang cố gắng sử dụng các mục sau làm tập lệnh khi được sử dụng trực tiếp hoặc nhập làm mô -đun vào mã khác của tôi và chạy từ đó. Nếu tôi nhập nó dưới dạng mô -đun, tôi sẽ gọi hàm chính () khi nhập nó? Cấu trúc sau đây có đúng trong cách tôi đã viết như sau không? Bất kỳ lời khuyên được đánh giá cao.main() function when importing it? Is the following structure correct in how I have written the following? Any advice is appreciated.

'''
Created on March 12, 2017

Create a new ArcHydro Schema

File Geodatabase and Rasters

Folder

@author: PeterW
'''
# import site-packages and modules
import re
from pathlib import Path
import arcpy

# set environment settings
arcpy.env.overwriteOutput = True


def archydro_rasters_folder(workspace):
    """Create rasters folder directory
    if it doens't already exist"""
    model_name = Path(workspace).name
    layers_name = re.sub(r"\D+", "Layers", model_name)
    layers_folder = Path(workspace, layers_name)
    if layers_folder.exists():
        arcpy.AddMessage("Rasters folder: {0} exists".format(layers_name))
    else:
        layers_folder.mkdir(parents=True)
        arcpy.AddMessage("Rasters folder {0} created".format(layers_name))


def archydro_fgdb_schema(schema, dem, workspace):
    """Create file geodatabase using XML
    schema and set coordinate system based
    on input DEM if it doesn't already exist"""
    model_name = Path(workspace).name
    fgdb = "{0}.gdb".format(model_name)
    if arcpy.Exists(str(Path(workspace, fgdb))):
        arcpy.AddMessage("{0} file geodatabase exists".format(fgdb))
    else:
        new_fgdb = arcpy.CreateFileGDB_management(str(workspace), fgdb)
        import_type = "SCHEMA_ONLY"
        config_keyword = "DEFAULTS"
        arcpy.AddMessage("New {0} file geodatabase created".format(fgdb))
        arcpy.ImportXMLWorkspaceDocument_management(new_fgdb, schema,
                                                    import_type,
                                                    config_keyword)
        arcpy.AddMessage("ArcHydro schema imported")
        projection = arcpy.Describe(dem).spatialReference
        projection_name = projection.PCSName
        feature_dataset = Path(workspace, fgdb, "Layers")
        arcpy.DefineProjection_management(str(feature_dataset),
                                          projection)
        arcpy.AddMessage("Changed projection to {0}".format(projection_name))


def main(workspace, dem, schema):
    """main function to create rasters folder
    and file geodatabase"""
    archydro_rasters_folder(workspace)
    archydro_fgdb_schema(schema, dem, workspace)


if __name__ == '__main__':
    main(workspace = r"E:\Projects\2016\01_Bertrand_Small_Projects\G113268\ArcHydro\Model04",
         dem = r"E:\Projects\2016\01_Bertrand_Small_Projects\G113268\ArcHydro\DEM2\raw",
         schema = r"E:\Python\Masters\Schema\ESRI_UC12\ModelBuilder\Schema\Model01.xml")

  • tranh luận
  • Nhập mô -đun
  • Mô -đun
  • gói
  • Python

  • Tất cả những bài viết
  • Chủ đề trước
  • Chủ đề tiếp theo

1 giải pháp

Peter ... Tắt đỉnh đầu của tôi .... bên dưới ... nếu __name __... Bạn nên có một cuộc gọi đến chức năng của bạn ... nó không phải được gọi là chính, tôi sử dụng _demo () và Khi tôi đang làm việc độc lập, nó sẽ chạy bất cứ điều gì thuộc & NBSP; Nếu __name ... dòng

def runme():
    do stuff here
# -------------------------------------------------------------------------
if __name__ == "__main__":
    """ No demo  """
    runme()‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

thì nếu bạn muốn nhập mô -đun

from mypackage import runme‍‍

Sau đó, bạn có thể sử dụng Runme bất cứ khi nào bạn muốn.

Để kiểm tra ... hãy thử một cái gì đó đơn giản. & Nbsp; Nhưng tập lệnh 'runme' của bạn nên có các đối số đặt trước hoặc sys.argv [1] của các tương đương văn bản getParameteras của nó. & Nbsp; Trong ví dụ trên, RunMe không cần bất kỳ tham số nào. & NBSP; Nếu bạn muốn có những thứ đó được thông qua hoặc đọc, thì bạn cần sửa đổi mã một chút

def runme(input_featureclass):
    do stuff here
# -------------------------------------------------------------------------
if __name__ == "__main__":
    """ No demo  """
    in_fc = r"\c:temp\something"
    runme(input_featureclass=in_fc)‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Sau đó, khi bạn gọi Runme từ chương trình chính của bạn, nó sẽ là

runme (in_fc) & nbsp; & nbsp; & nbsp; hoặc runme (sys.argv [1]) & nbsp; hoặc runme (getparameterastext (0))

cho nó một phát bắn

7 trả lời

Peter ... Tắt đỉnh đầu của tôi .... bên dưới ... nếu __name __... Bạn nên có một cuộc gọi đến chức năng của bạn ... nó không phải được gọi là chính, tôi sử dụng _demo () và Khi tôi đang làm việc độc lập, nó sẽ chạy bất cứ điều gì thuộc & NBSP; Nếu __name ... dòng

def runme():
    do stuff here
# -------------------------------------------------------------------------
if __name__ == "__main__":
    """ No demo  """
    runme()‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

thì nếu bạn muốn nhập mô -đun

from mypackage import runme‍‍

Sau đó, bạn có thể sử dụng Runme bất cứ khi nào bạn muốn.

Để kiểm tra ... hãy thử một cái gì đó đơn giản. & Nbsp; Nhưng tập lệnh 'runme' của bạn nên có các đối số đặt trước hoặc sys.argv [1] của các tương đương văn bản getParameteras của nó. & Nbsp; Trong ví dụ trên, RunMe không cần bất kỳ tham số nào. & NBSP; Nếu bạn muốn có những thứ đó được thông qua hoặc đọc, thì bạn cần sửa đổi mã một chút

def runme(input_featureclass):
    do stuff here
# -------------------------------------------------------------------------
if __name__ == "__main__":
    """ No demo  """
    in_fc = r"\c:temp\something"
    runme(input_featureclass=in_fc)‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Sau đó, khi bạn gọi Runme từ chương trình chính của bạn, nó sẽ là

runme (in_fc) & nbsp; & nbsp; & nbsp; hoặc runme (sys.argv [1]) & nbsp; hoặc runme (getparameterastext (0))

cho nó một phát bắn

7 trả lời

Chào Dan

Cảm ơn vì những điều sau đây, làm thế nào tôi sẽ thiết lập các đối số đầu vào cần được chuyển vào hàm Main () của tôi. Lý do tôi yêu cầu là tôi gọi hai chức năng mà cả hai đều sử dụng cùng một không gian làm việc đối số đầu vào.

def runme(folder):
    
    may_return_stuff = da_func1(folder)
    big_output = da_func2(folder, may_return_stuff)
    return big_output

# -------------------------------------------------------------------------
if __name__ == "__main__":
    """ No demo  """
    folder = r"\c:temp\something"
    runme(in_folder=folder)

Tôi sẽ cho rằng bạn sẽ chuyển điều đó cho

Bạn nhập, sử dụng RUNME, yêu cầu một thư mục mà bạn chuyển cho nó, DA_FUNC1 cần thư mục để làm công cụ. & NBSP; Sau đó da) func2, cần kết quả của DA_FUNC1 cũng như thư mục. & Nbsp; Chơi với một ví dụ đơn giản và đừng cố gắng thực hiện với các tập lệnh/mô -đun 'thực' của bạn cho đến khi bạn có được luồng bạn muốn, sau đó mô phỏng những gì hoạt động.

Cảm ơn Dan vì tất cả sự giúp đỡ của bạn, tôi sẽ đăng mã của tôi sau khi hoàn thành, rằng nó có thể giúp đỡ người khác.

Chào Dan \ Joshua

Như đã hứa, tôi đã đính kèm mô -đun được cập nhật của mình dựa trên các đề xuất của bạn cũng như các đề xuất mà tôi nhận được từ bài đăng Overflow Stack của mình:

________số 8

Nếu bạn đang nỗ lực chính thức hóa các mô -đun và tạo các gói, tôi khuyến khích bạn xem xét PEP 8 - Hướng dẫn kiểu cho mã Python. & NBSP; Có đề xuất đặt tên quy ước cho các chức năng, mô -đun, gói, v.v. & nbsp; Sẽ là một sự xấu hổ khi đặt tất cả nỗ lực này và khó có thể đọc hoặc duy trì.

Nhìn vào các quy ước đặt tên PEP 8:

Nguyên tắc ghi đè

Các tên có thể nhìn thấy cho người dùng là các phần công khai của API nên tuân theo các quy ước phản ánh việc sử dụng thay vì thực hiện.main() is reflecting the implementation and not the usage or purpose of a function.

Về mặt hiểu được vai trò của IF __name__ == '__main__':, tôi khuyến khích bạn xem qua tài liệu dòng lệnh và môi trường nếu bạn chưa có. & Nbsp;Ngoài ra, có một cuộc thảo luận tốt về chủ đề tại Stackoverflow: & nbsp;Điều gì nếu __name__ == "__main__": làm? ________ 9if __name__ == '__main__': , I encourage you to peruse the Command line and environment documentation if you haven't already.  Also, there is a good discussion on the topic at StackOverflow:  What does if __name__ == "__main__": do?

Chào Joshua,

Cảm ơn rất nhiều về đề xuất của bạn, tôi sẽ xem các liên kết sau mà bạn đã cung cấp và đăng mã đã hoàn thành của tôi sau đó.

Hướng dẫn python pass arguments to module - python truyền đối số cho mô-đun

  • Điều khoản sử dụng
  • Hướng dẫn cộng đồng
  • Cơ bản cộng đồng
  • Sự riêng tư
  • Trung tâm Tin tưởng
  • Hợp pháp
  • Liên hệ với ESRI