导入带参数的python脚本

导入带参数的python脚本,python,import,arguments,Python,Import,Arguments,我有剧本: 移动1.py: def move(): print("walk!") def move(): print("run!") import sys if len(sys.argv) <= 1: exit("Too less arguments calling script") __import__(sys.argv[1]) moving = sys.modules[sys.argv[1]] def move(): moving.move()

我有剧本:

移动1.py

def move():
    print("walk!")
def move():
    print("run!")
import sys

if len(sys.argv) <= 1:
    exit("Too less arguments calling script")

__import__(sys.argv[1])
moving = sys.modules[sys.argv[1]]

def move():
    moving.move()
移动2.py

def move():
    print("walk!")
def move():
    print("run!")
import sys

if len(sys.argv) <= 1:
    exit("Too less arguments calling script")

__import__(sys.argv[1])
moving = sys.modules[sys.argv[1]]

def move():
    moving.move()
man.py,它可以通过参数moving1或moving2脚本接受动作

man.py

def move():
    print("walk!")
def move():
    print("run!")
import sys

if len(sys.argv) <= 1:
    exit("Too less arguments calling script")

__import__(sys.argv[1])
moving = sys.modules[sys.argv[1]]

def move():
    moving.move()
有很多类似的问题,但它们并不完全符合我的要求。如何向导入的脚本添加参数?问题不在于检查

if __name__ = "__main__":

在这里,问题是要完全使用我想要的参数导入脚本。可能吗?

您应该将参数处理代码和导入代码分开:

man.py

import sys

def move():
    moving.move()

def setup(module):
    global moving
    moving = __import__(module)

if __name__ == "__main__":
    if len(sys.argv) <= 1:
        exit("Too less arguments calling script")

    setup(sys.argv[1])
import man
man.setup(<name>)
man.move()
导入系统 def move(): 移动 def设置(模块): 全球移动 移动=导入(模块) 如果名称=“\uuuuu main\uuuuuuuu”:
如果len(sys.argv)将文件名作为命令行参数,并希望导入它,则使用模块

基本上,imp模块有助于在运行时加载模块


希望这有帮助

您不能只提出这样一个字符串:“异常必须是旧式类或派生自BaseException,而不是unicode”为什么存在这种分离?将函数放在同一个文件中,只需将命令行参数映射到函数,就会容易得多。@msvalkon这只是一个简单的例子。假设movingN.py有100个小函数和参数,其中大多数是lambda或etc(因此,这是config,但更容易保持config为.py样式)。创建3-4个独立的配置文件并将它们传递给man.py,然后将它们混合到一个难以操作的文件中,这要简单得多。我应该将逻辑从movingN.py和man.py中分离出来,因为man.py中的代码不应该更改,而movingN中的代码可以由管理员更改。然后我建议您应该使用来定义命令行界面。@msvalkon有趣的东西,但它如何帮助我将参数从testman.py移动到man.py?那是行不通的。在“导入人”行将引发异常,因为不会有任何参数。哇!要移动所有参数处理代码。。。固定的!如果不存在通过将参数解析为作为参数的导入脚本来实现这一点的方法,我将使用它,谢谢!如果您想进行大规模的黑客攻击,只需更改testman.py中的内容
sys.argv
。即:将
sys.argv[1]=“moving1”
放在导入之前。但是,如果您想多次导入(如原始代码所示),每次都需要
重新加载(man)
。这看起来像是黑客攻击,我相信解决方案必须更简单,并且没有这些技巧。谢谢,但如果我这样修改testman.py:import imp man=imp.load_source(“man”,“moving1”),那么它就不起作用了。“未找到文件”。如果我加上“.py”。它仍然找不到“man.py”和whowme错误:moving1.py:4:运行时警告:处理绝对导入时未找到父模块“man”logging@Arkady在这种情况下,即使我添加了os.path.dirname,您也必须获取文件的绝对路径(追加当前工作目录或从_文件_获取路径),并将其传递给load_Source(os.path.abspath(file))在文件名之前,它仍然存在问题。它似乎需要“导入日志”的绝对路径。。。