编写Python脚本以使用控制台命令执行

编写Python脚本以使用控制台命令执行,python,linux,command-line,scripting,command-line-arguments,Python,Linux,Command Line,Scripting,Command Line Arguments,研究是在底部,阅读之前-1'ing。。。谢谢 我必须编写一个运行SQL查询的Python脚本。我创建了一个主类,名为SQLQuery。每个SQLQuery实例表示一个查询。脚本的结构必须如下所示: class SQLQuery(object): def __init___(self, string_myQuery)... instance1 = SQLQuery(SQLQuery1)... instance2 = SQLQuery(SQLQuery2)... $ python

研究是在底部,阅读之前-1'ing。。。谢谢

我必须编写一个运行SQL查询的Python脚本。我创建了一个主类,名为SQLQuery。每个SQLQuery实例表示一个查询。脚本的结构必须如下所示:

class SQLQuery(object):

     def __init___(self, string_myQuery)...

instance1 = SQLQuery(SQLQuery1)...

instance2 = SQLQuery(SQLQuery2)...
$ python -m foo bar
First arg is:  bar
根据用户要求,实例必须与类位于同一个文件中(因此我不能将每个实例都设置为main并单独执行该文件),并且每个实例都必须使用Linux控制台命令执行。我可以用一个简单的python SQLQuery.py执行整个脚本,但我需要分别执行每个实例。查询每天都会自动执行,所以我不需要终端UI树。应使用类似以下命令执行:

python SQLQuery.py -inst1
将执行instance1

python SQLQuery.py -inst2
将执行instance2

我研究了如何使用Linux命令执行Python脚本,大部分文章都是关于从Python脚本调用命令的。但是,我从Python文档中找到了。它建议添加-m,因此:

python SQLQuery.py -m inst1

这将允许我使用控制台命令设置main,但由于实例不是模块,因此它不起作用。由于实例必须与类位于同一个文件中,所以当我使用控制台命令执行SQLQuery.py时,我不能将它们作为模块导入。

忽略所有不相关的内容,听起来您的问题是您有一堆名为
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()

做同样事情的一个更好的方法是将
实例
全局变量放入一个可以索引的列表或dict中

例如,假设您得到了一个
实例
dict,其中包含
实例['1']
实例[2]
,而不是
实例1
,等等,而不是
实例

inst_name = 'instance' + inst_number
instance = globals()[inst_name]
instance.execute()
…你只要这样做:

instances[inst_number].execute()

此外,与其提出一个命令行参数,该参数中有额外的东西,您必须解析并丢弃,而且对人类读者来说,与代码相比,没有更多的意义,为什么不只取一个数字呢

python myscript.py 12
或者,使用创建一个参数,该参数可以以所有明显的方式使用:

python myscript.py --instance=12
python myscript.py --instance 12
python myscript.py -i12
python myscript.py -i 12

无论哪种方式,您的代码都会获得字符串
'12'
,然后可以使用该字符串查找函数,如上所述。

您的
-m
选项语法错误。假设您有以下文件名为
foo.py

import sys
print 'First arg is: ', sys.argv[1]
那么你会这样称呼它:

class SQLQuery(object):

     def __init___(self, string_myQuery)...

instance1 = SQLQuery(SQLQuery1)...

instance2 = SQLQuery(SQLQuery2)...
$ python -m foo bar
First arg is:  bar

请注意,省略了“.py”扩展名。然后,您可以使用命令行参数来决定要使用哪个对象,或者使用
argparse
optparse
模块来处理该参数。

为什么不向脚本传递一个命令行参数,告诉它要运行哪个实例?您提供的结构没有意义
SQLQuery
将自身作为基类,并将自身作为
\uuuuu init\uuuu
参数?另外,什么是
MainClass
SQLQuery1
?另外,该文档建议在哪里添加
-m
?它描述了
-m
如何作为
python
本身的一个参数工作,它意味着按名称查找和执行模块;这并不意味着
-m
作为脚本的参数意味着什么。签出,构建一个命令行界面Martineau,这就是我要做的。你已经描述了我的问题。abarnert,没关系。谢谢你bogatron,但我不能调用外部文件。这是用户需求。也许我不理解你的问题。我不是建议你调用外部文件。上面的
foo.py
文件是您的
SQLQuery.py
文件。您可以使用命令行参数来决定在文件中使用哪个对象。如果您试图在现有的Python进程中创建命令行来创建新对象,那么您应该考虑Python < Cult>多进程< /C>模块,这将使您能够轻松地建立一个服务器进程,可以从命令行访问该模块,从而在模块内创建新对象。如果我有更多的代表,我会投上更高的票。其他人只是挑出不相关的东西,投下我的票,因为他们找不到我在文章底部做的研究。我想下次我会把我的研究放在首位。我会试着把这些实例编入字典。这似乎是最简单、最干净的解决方案,而且它不必是人类可读的,因为服务器每天都会在计时器上运行命令。@JaneGoodall:作为提问者,接受正确的答案或对最佳答案的评论,以解释在值得接受之前如何改进,比向上投票更重要。