如何在带有参数的另一个python脚本中运行函数?

时间:2013-09-25 19:45:50

标签: python multithreading python-3.x

我正在尝试使用一些不同的命令创建一个运行另一个python脚本的脚本。我想验证用户并搜索用户给出的歌曲。然后脚本验证spotify帐户,搜索给定的歌曲然后播放。

以下是验证Respotify的时间:

python respotify.py john doe

搜索一首歌:

search Wrecking Ball

在指定数量的搜索后播放歌曲结果将是:

play 1

我知道我可以在我的play.py文件中使用它来调用该函数:

import os
os.system = ("search Wrecking Ball")

但我希望我的“play.py”在后台运行respotify.py。我已经尝试将其置于respotify.py函数中,以便在脚本启动时可以调用一首歌。

import os 

os.system = "search Wrecking Ball"

我试过但是我的脚本会忽略它。

但我认为这比那更复杂。你可以找到respotify.py here

感谢nickie

,现在关闭解决我的问题

他的回答是:

from subprocess import Popen, PIPE

p = Popen(["python", "respotify.py", "john", "doe"], stdin=PIPE, stdout=PIPE)
print >> p.stdin, "search Wrecking Ball"
output = p.communicate()[0]

但是我在控制台中遇到了这个错误:

File "respotify.py", line 338, in <module> command_loop() File "respotify.py", line 29, in command_loop command = raw_input().split(" ") EOFError: EOF when reading line

如何解决上述错误?

4 个答案:

答案 0 :(得分:4)

os.systemsubprocess.call都在子进程中执行程序,就像从命令行执行一样。如果我理解正确,你想执行命令:

python respotify.py john doe

并用输入提供,就像给它的stdin一样,它将包含以下行:

search Wrecking Ball

可以使用以下代码完成此操作:

from subprocess import Popen, PIPE

p = Popen(["python", "respotify.py", "john", "doe"], stdin=PIPE, stdout=PIPE)
input = "search Wrecking Ball\n" + "play 1\n"
output = p.communicate(input)[0]

或者,如果您要提供的输入取决于子流程为您提供的输出,您可以打印到p.stdin并从p.stdout读取。

from subprocess import Popen, PIPE

p = Popen(["python", "respotify.py", "john", "doe"], stdin=PIPE, stdout=PIPE)
print >> p.stdin, "search Wrecking Ball"
output = p.stdout.readline()
print >> p.stdin, "play 1"
print >> p.stdin, "quit"
p.wait()

检查subprocess模块的documentation以获取更多详细信息。

如果与子进程的通信协议很复杂,那么绝对应该使用比这更好的东西,比如@abernert建议的pexpect库。

答案 1 :(得分:3)

尝试与CLI脚本交互 - 发送命令,等待响应和提示等等 - 这是一个痛苦的问题。像pexpect这样的库可以让您更轻松,但它仍然不容易。


但幸运的是,你不必这样做。 respotify显然可以用作模块而不是脚本,所以,不要尝试生成输入来提供它以便它可以解析它,依此类推,只需导入它并直接使用它。

或者,更简单地说,respotify中的所有代码都很简单 - 至少与尝试通过CLI进行交互一样简单。所以直接使用Spotify模块。

答案 2 :(得分:2)

os.system = ("search Wrecking Ball")

不按照您的想法行事。你想要

output = os.system("search Wrecking Ball")

请注意,现代的方法是

output = subprocess.call(["search", "Wrecking", "Ball"])

答案 3 :(得分:1)

如果你可以避免它,请不要让你的Python脚本通过子进程或pexec,et.al运行其他Python脚本。这些是“来自老年人”的最后选择。

Python为我们提供了精彩礼物,只需import另一个Python脚本作为库并直接调用它。

如果可能,import respotify并直接调用其方法。如果没有,“库 - itize”它可以直接调用它。你的时间和理智会感谢你。