【问题标题】:How to prevent an imported module from 'importing' sys.argv[1:]如何防止导入的模块“导入”sys.argv[1:]
【发布时间】:2012-07-27 04:53:29
【问题描述】:

我是 python 新手。为了以易于理解的方式提出我的问题,我创建了两个脚本。一个脚本名为:calling_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 将在“calling_script.py”中显示为 sys.argv[1]

是否有任何代码可以添加到“called_script.py”,以便“called_script.py”可以确定 sys.argv[1] 是从命令行传递给它的,还是 sys.argv[1] 是从 'ma​​in' 传递给它的?

另外,我很想知道是否可以防止例如 sys.argv[1] 从 ma​​in 传递到导入的模块,以及在哪里可以找到有关此的一些阅读主题。

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

                      Marc

【问题讨论】:

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


    【解决方案1】:

    有没有我可以添加到“called_script.py”的代码,以便 'called_script.py' 可以确定 sys.argv[1] 是否被传递给 它来自命令行,或者 sys.argv[1] 是否从 '主要'?

    基本上,不,因为命令行参数没有传递给 模块,它们被传递给 Python,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 的等效项。同样,您可以在calling_script.py 的最开始处分支__name__,隐藏sys.argv,然后修改sys 中的那个(ick)。

    但一般来说,无论如何,您不需要在主程序之外的任何地方使用sys.argv。如果您需要在多个地方访问sys.argv,您的界面可能与您的例程没有足够的分离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2017-05-01
      • 2018-11-08
      相关资源
      最近更新 更多