如何防止导入的模块“导入”sys.argv [1:]

时间:2012-07-29 01:36:40

标签: python-2.7 command-line-arguments python-module

我是一个蟒蛇新手。为了以易于理解的方式提出我的问题,我创建了两个脚本。一个脚本命名为:called_script.py另一个脚本名为:calling_script.py

以下两行是called_script.py

中的代码
 import sys
 print str(sys.argv[1]) + '\n\n' + str(dir(sys.argv[1]))

以下两行是calling_script.py

中的代码
 import sys
 import called_script

如果我将'foo'作为命令行参数提供给'calling_script.py',foo将在'called_script.py'中显示为sys.argv [1]

是否有任何代码可以添加到'called_script.py'以便'called_script.py'可以确定 sys.argv [1]是否从命令行传递给它,或者sys.argv [1]是否从' main '传递给它?

另外,我很想知道是否可以阻止例如sys.argv [1]从 main 传递到导入的模块,并且我可以在这里找到一些阅读主题。

感谢您的帮助。非常感谢。

                      Marc

1 个答案:

答案 0 :(得分:1)

  

是否有任何代码可以添加到'called_script.py'中   'called_script.py'可以确定是否传递了sys.argv [1]   它来自命令行,或者sys.argv [1]是否从它传递给它   '主'?

从根本上说,不,因为命令行参数没有传递给 modules ,所以它们被传递给Python,后者将它们放在sys.argv中。由于所有模块都共享相同的sys,因此它们都会看到相同的sys.argv,就是那样。

也就是说,您可以利用__name____main__仅对主脚本设置为~/coding$ python calling_script.py fred called_script says __name__ is: called_script calling_script says __name__ is: __main__

args = sys.argv if __name__ == '__main__' else [whatever_you_want]

所以你可以使用像

这样的东西
args

然后使用sys.argv获取特定于模块的__name__。同样,您可以在calling_script.py开始时sys.argv分支,隐藏sys,然后修改sys.argv(ick)中的那个。

但一般来说,您无需在主程序之外的任何地方使用sys.argv。如果您需要在多个位置访问{{1}},那么您的界面可能与您的例程分离不足。