【问题标题】:Why can't I do "import sys.argv[1]"? [duplicate]为什么我不能执行“import sys.argv[1]”? [复制]
【发布时间】:2021-04-16 16:29:03
【问题描述】:

我创建了一个名为 parameter.py 的模块,并想使用 sys.argv 导入它,如下所示。

import sys
from sys.argv[1] import *

但是当我运行 python 文件时,出现以下错误:

python test.py parameter


File "test.py", line 17
    from sys.argv[1] import *
                 ^
    SyntaxError: invalid syntax

为什么它不起作用,我还能做些什么来使它起作用?

【问题讨论】:

  • "我使用 sys.argv 创建的一个名为 parameter.py 的模块" 你认为这到底意味着什么?你如何相信你正在“使用 sys.argv”“创建”模块,为什么你认为 parameter.py 是这样一个模块? (请务必区分模块名文件名。)
  • 如果import 语句中的名称将被评估为表达式,那么import foo 将意味着“导入具有变量foo 包含的名称的模块”,而不是“导入模块foo”...
  • 这样做也完全不清楚您希望解决什么问题。如果您不提前知道将导入哪个模块,您怎么知道导入它是一个好主意?
  • 无论如何,语法没有任何意义,原因与'parameter' = 3 没有任何意义相同。字符串与标识符不同。
  • 很抱歉给您带来了困惑!我的意思是说我创建了一个要使用 sys.argv 导入的模块。我编辑了我的问题以更清楚!

标签: python argv sys


【解决方案1】:

变量不允许在 import 语句中

import sys
__import__(sys.argv[1])

全球导入

import sys
globals().update(__import__(sys.argv[1]).__dict__)

示例用法

import sys

sys.argv.append("math")
pi = __import__(sys.argv[-1]).pi
print(pi)

或者

import sys

sys.argv.append("math")
globals().update({k: v for k, v in __import__(sys.argv[-1]).__dict__.items() if not k.startswith("__")})
print(pi)
print(__name__)

输出

3.141592653589793
__main__

【讨论】:

  • 感谢您的评论!我都试过了,似乎 globals 方法确实正确导入了它(正是我想要的!)除了 __name__ 现在也切换到我导入的模块的名称。如果我使用from module import * 导入模块,__name__ 将保持为__main__。这里有什么区别?有没有一种方法可以使用 sys.argv 导入(就像使用 globals() 一样),同时保持 __name____main__
  • @monosix 很抱歉忘记排除 __name____doc____package____loader____spec__ 等成员。我现在改变了答案。
猜你喜欢
  • 2018-08-17
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多