2013-09-25 33 views
0

我试图做一个脚本,用一些不同的命令运行另一个python脚本。我想验证用户并搜索用户提供的歌曲。然后脚本验证Spotify帐户,搜索给定的歌曲然后播放它。如何使用参数在另一个python脚本中运行函数?

这里是它的外观时验证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 

如何解决上述错误?

+1

您是否尝试与其他脚本进行交互,发送命令,然后等待提示和响应?如果是这样,请查看['pexpect'](http://www.noah.org/wiki/Pexpect)。但我认为您不需要首先执行此操作... – abarnert

回答

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库。

+0

看起来不错,只是有一些错误返回。我会分享: '文件 “respotify.py”,线路338,在 command_loop() 文件 “respotify.py”,第29行,在command_loop 命令的raw_input =()分裂(”“) 。 EOFError:读取行时的EOF – Jack

+0

导入sys 现在尝试在我的扬声器中发出一些声音。 – Jack

+0

如果你打算使用'communic',你真的不应该直接写'stdin'。只要通过搜索Wrecking Ball作为输入到函数即可。但是这听起来像是不会起作用的,所以... – abarnert

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

不按照你的想法做。你想

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

注意的是,现代的方式做,这是

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

我不确定您认为这会修复哪些内容。在任何一种情况下,'output'都会成为一个数字 - 无论其他脚本的退出代码如何 - 他的代码似乎没有任何用处。如果它不工作,或者使它在后台运行(如他暗示他希望在某个时刻),或者让他有机会通过输入或其他任何东西,那么这两种变化都不会使它工作。 – abarnert

+0

啊,我误解了。那么Nvm。 – Veedrac

3

试图与CLI脚本进行交互 - 发送命令,等待响应和提示等 - 是一个痛苦的脖子。有像pexpect这样的库可以让你更容易,但它仍然不容易。


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

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

1

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

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

如果可能的话,import respotify并直接调用它的方法。如果没有,“图书馆化”它,以便它可以直接调用。你的时间和理智会感谢你。

相关问题