【问题标题】:Passing variables as Arugements将变量作为参数传递
【发布时间】:2017-09-06 19:53:46
【问题描述】:

我以这种方式将两个变量传递给另一个 python 文件。

 os.system('"F:\Main.py" %s `%s' % (id, value))

参考上面的例子:

文件 1.py

id="tester"
value="foo boo"
os.system('"F:\Main.py" %s %s' % (id, value))

Main.py

argu1=sys.argv[1]
argu2=sys.argv[2]
print("Argument 1 is", argu1)
print("Argument 2 is", argu2)

它会打印

Argument 1 is tester
Argument 1 is foo

您可能已经注意到缺少 'boo' 部分。
为什么会丢失,我该如何解决?

附言。
我使用 os.system 而不是子进程的原因是因为我需要 File 1.py 继续其职责而不必等待 Main.py 完成

【问题讨论】:

  • 这就是为什么你不应该为os.system构建命令行字符串。

标签: python operating-system


【解决方案1】:

"boo"sys.argv[3],因为你使用了没有转义的字符串格式来构建你的命令行字符串,导致调用

os.system('"F:\\Main.py" tester foo boo')

与使用os.system相比,使用subprocess module执行子进程更安全:

import subprocess

subprocess.run(["F:\\Main.py", id, value])

但考虑到另一个程序也是 Python 程序,听起来您在使用单独的脚本来组织代码时可能应该使用模块和函数,因此使用任何工具启动单独的进程可能不是您的方式应该解决这个问题。

如果您不想等待工作人员完成,可以使用subprocess.Popen 而不是subprocess.runos.system 绝不会给你这种行为; os.system 也等待工人完成。不过,使用threadingmultiprocessing 可能会更好。

此外,反斜杠应该被转义,如"F:\\Main.py",而不是"F:\Main.py"

【讨论】:

  • 我使用 os.system 而不是子进程的原因是因为我需要 File 1.py 继续其职责而不必等待 Main.py 完成
  • @Elo97234c: os.system 也在等待其他进程完成。
  • 不,它没有。它启动python文件,就是这样。它不是子进程。它是一个新的过程
  • @Elo97234c:os.system返回新进程的退出状态;你如何想象它会在不等待进程退出的情况下做到这一点?
  • 谢谢你的信息!
【解决方案2】:

发生这种情况是因为操作系统按空格分割参数。对于托管,它需要在"name boo" 中放置一个变量。在你的情况下:

os.system('"F:\Main.py" "{}" "{}"'.format(id, value))

【讨论】:

  • 我的完整文件路径是“F:\Program Test\Main.py”,通过尝试你的代码它得到 '''F:\Program' 不是内部或外部命令,可运行的程序或批处理文件。
  • 'Program' 和 'Tes't 之间的间距导致我尝试用 ''\\' 替换并在开头添加 '@' 仍然没有运气
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 2018-05-25
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多