研究在底部,在-1之前阅读...谢谢。
我必须编写一个运行SQL查询的Python脚本。我创建了一个主类并调用了SQLQuery。每个SQLQuery实例代表一个查询。脚本的结构必须如下:
class SQLQuery(object):
def __init___(self, string_myQuery)...
instance1 = SQLQuery(SQLQuery1)...
instance2 = SQLQuery(SQLQuery2)...
作为用户要求,实例必须与类在同一个文件中(因此我不能只使每个实例成为主要文件并单独执行该文件),并且每个实例必须使用Linux控制台命令执行。我可以使用简单的python SQLQuery.py执行整个脚本,但我需要单独执行每个实例。查询将每天自动执行,因此我不需要终端UI树。它应该使用类似于以下的命令执行:
python SQLQuery.py -inst1
将执行instance1。
python SQLQuery.py -inst2
将执行instance2。
我研究过如何使用Linux命令执行Python脚本,大多数文章都是关于从Python脚本调用命令。但是,我从Python文档中找到了this article。它建议添加-m,所以:
python SQLQuery.py -m inst1
这将让我使用控制台命令设置我的主,但它不起作用,因为实例不是模块。由于实例必须与类在同一个文件中,因此当我使用控制台命令执行SQLQuery.py时,我不能将它们作为模块导入。
答案 0 :(得分:1)
忽略所有无关紧要,听起来你的问题是你有一堆名为instance1
,instance2
,instance3
等的全局对象,你想要打电话给一些其中一个方法基于命令行参数的方法,该参数的值与实例名称相似但不相同。
这可能不是一个好主意......但并不是那么难:
if __name__ == '__main__':
inst = sys.argv[1] # will be 'inst1', 'inst13', etc.
inst_number = inst[5:] # so '1', '13', etc.
inst_name = 'instance' + inst_number
instance = globals()[inst_name]
instance.execute()
更好的方法是将instance
全局变量放入可以索引的列表或字典中。
例如,假设代替instance1
,instance2
等,您有一个instances
字典,instances['1']
,instances[2]
,等等而不是:
inst_name = 'instance' + inst_number
instance = globals()[inst_name]
instance.execute()
...你这样做:
instances[inst_number].execute()
此外,不是想出一个命令行参数,其中包含额外的东西,你必须解析并丢弃,并且对于人类读者没有比代码更多的意义,为什么不采取一个数字?
python myscript.py 12
或者,或者,使用argparse
创建一个可以以所有显而易见的方式使用的参数:
python myscript.py --instance=12
python myscript.py --instance 12
python myscript.py -i12
python myscript.py -i 12
无论哪种方式,您的代码都会获得字符串'12'
,然后可以使用它来查找函数,如上所述。
答案 1 :(得分:1)
-m
选项的语法错误。假设您有以下名为foo.py
的文件:
import sys
print 'First arg is: ', sys.argv[1]
然后你会这样称呼:
$ python -m foo bar
First arg is: bar
请注意,省略了“.py”扩展名。然后,您可以使用命令行参数来决定使用哪个对象,或使用argparse
或optparse
模块来处理参数。