- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我觉得这应该是显而易见的,但我已经在谷歌上搜索了很多关于这个问题的信息,但我还没有找到解决方案,所以如果您可以的话,我将不胜感激:
我编写了一个 python 脚本,我希望能够将其用作命令行应用程序,同时也可以将其用作可以在其他应用程序中加载的模块。到目前为止,我只编写了命令行选项的代码。以下是我的文件 etl.py 结构的摘要:
import os
import re
import sys
import shlex
import argparse
import itertools
import subprocess
from sqlalchemy import create_engine, text
# other imports here...
def etl(argv):
"""
ETL function for rasters ...
# more doc here
"""
args = parser.parse_args(argv)
d = vars(args)
os.chdir(d.get("root_dir"))
files = [f for f in os.listdir(".") for p in d.get("products") if p in f]
# a) Reprojection (option "r")
if d.get("which") == "r":
for f in files:
ofile = os.path.abspath(os.path.join(d.get("reproj_dir"), f))
if os.path.exists(ofile):
if d.get("overwrite") is True:
gdutil.reproject(os.path.abspath(f), ofile, .get("proj"))
else:
print("{}: File already exists. skipping".format(ofile))
else:
gdutil.reproject(os.path.abspath(f), ofile, d.get("proj"))
print("All files reprojected into EPSG {}".format(d.get("proj")))
# b) Merge (option "m")
if d.get("which") == "m":
# more operations here until...
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description="""
'Extract, Transform, Load' script for rasters ...""",
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("-dir", help="""
directory containing the input rasters to process
default value is the current directory""",
dest="root_dir", default=os.getcwd(), const=os.getcwd(), nargs="?", metavar="DIR")
gen_opts = argparse.ArgumentParser(add_help=False)
gen_opts.add_argument("-p", help="""
product type(s) to process
default is to process all products in DIR.
""".format(os.path.basename(sys.argv[0])),
dest="products", nargs="*", metavar="PROD")
# more gen_opts arguments here
subparsers = parser.add_subparsers()
parser_r = subparsers.add_parser("r", help="""
reproject rasters into target reprojection
if rasters corresponding to the passed arguments are found, they will be
reprojected into the target spatial reference system as defined by
the passed EPSG code
reprojected files will have the same pixel resolution as the input
rasters
resampling method is nearest neighbor
reprojected files are saved to the folder specified with option -r_dir
or to its default value if missing
""".format(os.path.basename(sys.argv[0])),
parents=[gen_opts, overw_opts])
parser_r.add_argument("proj", help="""
EPSG code of the destination reprojection""",
type=int, metavar="EPSG_CODE")
# more parser_r arguments here
parser_r.set_defaults(which="r")
parser_m = subparsers.add_parser("m", help="""
merge input rasters into a mosaic
rasters are merged based on the supplied level
all files that are included in a merge must have the same projection,
pixel size, no-data value, and be unique in space. otherwise, results
are not guaranteed""", parents=[gen_opts, group_opt, overw_opts])
parser_m.add_argument("-m_dir", help="""
if supplied, the merged rasters will be saved in directory M_DIR
if not supplied they will be saved to a subfolder named 'merged'
located at in DIR, or in R_DIR if a reprojection was made in the same
call""",
dest="merge_dir", type=str, nargs=1, metavar="M_DIR")
parser_m.set_defaults(which="m")
# more parsers and arguments here
# etl(sys.argv)
etl(["-dir", "E:\\Data\\Spatial\\soilgrids.org", "r", "3175", "-c", "M"])
到目前为止,我只能在最后一行未注释的情况下运行它,并从终端调用脚本而不带参数,但这不是现在的主要问题。
我的问题是:如何将该脚本用作可以在其他脚本中导入的模块,例如从 etl 导入重新项目?
我认为一件事是将我的部分代码(即以注释开头的每个部分,例如a)重新投影,b)合并,c)...)放在自己的函数中:
def reproject():
# add code here
def merge():
# add code here
然后向每个解析器添加默认函数(例如 parser_r.set_defaults(func=reproject)),但是如果我还想从另一个要导入的应用程序中使用它们,我将如何定义每个函数定义的参数模块etl,例如:
from etl import reproject
reproject() # arguments?
我必须添加可选参数或关键字吗?我是否必须测试参数是否可以使用 parser.parse_args 进行解析?我该怎么做?
非常感谢您的帮助!
最佳答案
您必须更改函数的调用签名(和正文)
def etl(argv):
...
这样它就不会对argv
做任何事情。相反,它看起来像:
def etl(products, reproj_dir, ...):
...
这称为为函数定义接口(interface)。
您可以将所有参数解析内容保留在 if __name__ == '__main__':
block 中,但是当您调用 etl
时,您应该使用sys.argv
的内容。 您也应该将调用 parser.parse_args
的行移到此 block 内。
看看函数的主体,它似乎进入了两种模式,所以实际上最好是 def reproject
和 def merge
,然后确定正如您所想的那样,这些接口(interface)。
一旦有了正确的接口(interface),只需导入模块并直接调用这些函数即可。实际功能根本不需要了解命令行界面。
关于python - 脚本如何用作命令行应用程序或模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736253/
我有以下查询: SELECT I.InsuranceID FROM Insurance I INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
我想在 SwiftUI 布局中将此函数用作具有不可变值的模板,但得到错误 Result of call to 'padding' 未使用: func keys (padding: CGFloat, t
直到最近我才使用 View 的标签元素,此后发现了一些很酷的用途。我遇到了一个不寻常的问题,希望有人能回答。这可能比 Android 更通用,但我不确定。它与 Java 如何处理 Integer 类有
这个问题在这里已经有了答案: What is the purpose of the var keyword and when should I use it (or omit it)? (19 个回
我有以下脚本(见下文)。我有两个问题: 1.在 Knockoutjs 的上下文中,下面这行是什么意思? ko.observable(null); 2.如何调用这里尚未定义的函数: that.activ
Java 社区中是否存在一种使用 with-repect-to 在方法中使用多个返回的思想流派,如下所示: public SomeClass someMethod(int someValue) {
我一直在尝试为我的网站创建一个小型社交媒体栏。出于某种原因,我无法计算出我想用来创建 Sprite 的图像无法加载。我还应该提一下,我在背景图像不显示方面遇到过类似的问题。 HTML调用是这样的:
我正在尝试使用 std::pair 枚举值作为 unordered_map 容器的键,但我在定义自定义哈希函数时遇到困难。 我尝试了以下方法: // Enum and pair declaration
我正在学习 JS/JQuery 以及匿名函数和闭包。我见过这样的例子: $('.button').click(function(){ /* Animations */ /* Other
我正在尝试使用菜单列表来浏览我的应用程序。尽管应用程序和路由运行良好,但我使用这段代码在控制台中收到了一些警告: {props.itemList.map((item, index) =>(
我只是想创建一个简单的测试,我在其中使用 DelegateHandlers 来实例化一个 HttpClient 而无需引入 Asp.net Core 包。我有 2 个删除处理程序 Throttling
我是answering another question在这里,用户有一个 ListView与 ItemsSource包含 UserControls .我说我不会推荐它,并被问为什么。 这真的让我很惊
我安装了3.5.2和 3.5.3使用 pyenv 的版本。 # pyenv versions * system (set by /usr/local/pyenv/version) 3.5.2
我正在使用 android studio 制作统一插件,但这里有问题。一些 SDK 提供仅使用 AppcompatActivity 来制作 fragment 但我的MainActivity , 正是
我在 Laravel 中使用 whereHas 来构建查询: })->whereHas('results', function ($query) use ($issued, $mode, $reque
我有一个 5Gb .dat 文件(> 1000 万行)。每行的格式如 aaaa bb cccc0123 xxx kkkkkkkkkkkkkk或 aaaaabbbcccc01234xxxkkkkkkkk
我有一个消费者类,它采用 NSInputStream 作为参数,它将被异步处理,并且我想推送来自生产者类的数据,该生产者类要求它提供 NSOutputStream 作为其输出源。现在我如何设置一个缓冲
我正在尝试使用 ENVs在 Symfony2 中设置我的参数。标量值很简单,但我有一些参数是数组,我需要使用 ENV 以某种方式设置它们。 有问题的参数: parameters: redis.se
在我的类作业中,我已经成功地做到了这一点,但只是在非常简单的程序中。今天,我有一个更复杂的程序,在我将 DEBUG 定义为一个符号后,Eclipse 做了可怕的笨拙的事情,并且在我删除定义后这些可怕的
我目前有 2 个复选框类别、一个下拉列表和一个表单中的提交按钮。该按钮应保持“禁用”状态,直到选中 A 类的一个复选框和选中 B 类选项之一并选择选择列表中的一个选项。它适用于复选框(当我在没有列表的
我是一名优秀的程序员,十分优秀!