0

我正在尝试制作一个脚本,该脚本使用一些不同的命令运行另一个 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 :

感谢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

4 回答 4

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.stdinp.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获取更多详细信息。

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

于 2013-09-25T20:03:21.023 回答
3

尝试与 CLI 脚本交互(发送命令、等待响应和提示等)是一件令人头疼的事情。有这样的库pexpect可以让您更轻松,但这仍然不容易。


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

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

于 2013-09-25T20:25:08.680 回答
2
os.system = ("search Wrecking Ball")

不做你认为它做的事。你要

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

请注意,执行此操作的现代方法是

output = subprocess.call(["search", "Wrecking", "Ball"])
于 2013-09-25T19:49:40.770 回答
1

如果可以避免,请不要让您的 Python 脚本通过 subprocess 或 pexec 等运行其他 Python 脚本。这些是“来自老年人”的最后选择。

Python 为我们提供了一个美妙的礼物,即只需将import另一个 Python 脚本作为库并直接调用它。

如果可以的话,import respotify直接调用它的方法。如果没有,请对其进行“library-itize”以便可以直接调用它。您的时间和理智将为此感谢您。

于 2013-09-26T17:19:38.493 回答