Jump to content
Dr_Lion

Python abrir firefox

Recommended Posts

Dr_Lion

Ora bem, o que eu queria era conseguir lançar uma janela nova do firefox com um script em python e com o site que quero que abra de início.

Já vi várias formas de o fazer, mas depois não consigo fechar essa mesma janela.

#!/usr/bin/env python
import os
import sys
import time
import subprocess
pid1=os.getppid();
print ("pid pai: ", pid1)
pidfilho=os.getpid();
print ("pid filho: ", pidfilho)

fich = open("lista", "r")
pid1=os.getppid();
print ("pid pai: ", pid1)
pidfilho=os.getpid();
print ("pid filho: ", pidfilho)
for line in fich:
pid1=os.getppid();
print ("pid pai: ", pid1)
pidfilho=os.getpid();
print ("pid filho: ", pidfilho)
#p = subprocess.Popen(["firefox", line])
#p = subprocess.call(["firefox", line])
#p = os.popen(["firefox", line])
p = subprocess.Popen(["firefox", "-n", line])
#p = os.system("firefox")
time.sleep(240)
fich.close()
print "fim"

A parte que não estou a conseguir atingir é como obter o PID do subprocess.

Os comentários tratam de formas que não estava a conseguir pôr a funcionar correctamente.

Com o módulo webbrowser é bastante fácil de abrir, mas depois não sei como faço para fechar.

E também não sei qual a forma mais correcta de abrir e fechar os mesmos do ponto de vista da eficiência ou de qualquer outro, usei esta forma porque foi a que consegui por a funcionar até agora.

Desde já agradeço a ajuda.

Edited by Dr_Lion

Share this post


Link to post
Share on other sites
Pedro C.

Olá,

O objecto aberto pelo Popen do subprocess (a tua variável "p") tem um comando "pid". Citanto a página do subprocess (http://docs.python.org/2/library/subprocess.html):

Popen.pid

The process ID of the child process.

Note that if you set the shell argument to True, this is the process ID of the spawned shell.

Tenta usar este comando e avisa se resultou. Basei esta resposta num tópico do stack overflow (ver: http://stackoverflow.com/questions/15799012/how-to-get-pid-via-subprocess-popen-with-custom-environment-variable).

Espero que ajude.

EDIT: esqueci-me da tua outra questão. Na mesma página do subprocess (o primeiro link). Está o seguinte:

Popen.kill()

Kills the child. On Posix OSs the function sends SIGKILL to the child. On Windows kill() is an alias for terminate().

New in version 2.6.

Não se a que fim se destina o teu código mas penso que a biblioteca que melhor se adequa ao tipo de operações que pretendes é o urllib2 (http://docs.python.org/2/library/urllib2.html).

Considera se precisas mesmo de abrir o browser para cumprires o teu objectivo.

Edited by Pedro C.

Share this post


Link to post
Share on other sites
Dr_Lion

Ora bem, estou de volta, obrigado pela ajuda creio que já consegui fazer o que tinha em mente. No código anterior apenas me faltava a linha

p.kill();

No entanto ao que parece e depois de muito pesquisar, existe um "problema" que tem haver com as instâncias abertas do firefox e como o linux funciona, ou seja se já tivesse um firefox aberto, o script realmente abria os outros mas não os fechava (o kill não funcionava). A única opção que encontrei depois de procurar um bom bocado foi criar outro perfil para o firefox, ou seja tendo 2 perfis, permite que existam duas instâncias do firefox diferentes, a correr em processos diferentes. Com este truque já é possível fazer o que queria, ou seja o script a abrir e fechar janelas do firefox, de notar que tive ainda que desactivar a opção resume_session_crash para evitar o acumular de tabs cada vez que a janela é aberta e fechada.

Eu crio que já andei a mexer nesse urllib2 quando andei a brincar (a tentar fazer um crawler), vou dar uma olhadela de novo nele, pois pode dar jeito para a fase seguinte desta brincadeira.

Código:

import os
import time
import subprocess

fich = open("listas", "r")

pid=os.fork()
if pid:
   # parent
print("I'm the parent")
print "pid do pai supostamente", pid   
else:
   # child
print("I'm just a child")
print "pid do filho supostamente",pid
for line in fich:
 p = subprocess.Popen(["firefox", "-no-remote", "-P", "youtu", line])
 print "pid subproc", p.pid
 time.sleep(10)
 p.kill()
fich.close()
print "fim"

Outra alternativa (faz exactamente o mesmo):

import os
import sys
import time
import subprocess
fich = open("listas", "r")
for line in fich:
p = subprocess.Popen(["firefox", "-no-remote", "-P", "youtu", line])
bra = p.pid
print "ppp: ", bra
time.sleep(10)
p.kill()
fich.close()
print "fim"

Para ter o meu objectivo concluído faltam-me agora duas alineas.

- uma será ter os processos/firefox a abrir em back-ground, para poder estar a trabalhar noutras janelas sem aquelas me saltarem á frente do que estou a fazer

- conseguir obter a duração do video do youtube, para que as páginas não sejam fechadas antes do som terminar, ou muito depois do mesmo acontecer.

O ficheiro listas, é um ficheiro de texto com um link de um video do youtube por cada linha.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
Pedro C.

Em relação a o firefox (ou qualquer outro processo estar a funcionar em background) sugiro que experimentes a seguinte instrução:

p = subprocess.Popen(["firefox", "-no-remote", "-P", "youtu", line],shell=False)

Em relação a tirar a duração de um video do youtube só posso sugerir algo que nunca usei que é a api do youtube (ver: https://developers.google.com/youtube/1.0/developers_guide_python#UnderstandingVideos). Citando esta página:

There are many pieces of meta-data that can be retrieved from a gdata.youtube.YouTubeVideoEntry object, such as thumbnails, player URLs, and video duration. The following code demonstrates how to get at some of this information...

Na mesma página esta informação encontra-se sobre o título Video entry contents.

Share this post


Link to post
Share on other sites
Dr_Lion
Em relação a o firefox (ou qualquer outro processo estar a funcionar em background) sugiro que experimentes a seguinte instrução:
p = subprocess.Popen(["firefox", "-no-remote", "-P", "youtu", line],shell=False)

Em relação a tirar a duração de um video do youtube só posso sugerir algo que nunca usei que é a api do youtube (ver: https://developers.google.com/youtube/1.0/developers_guide_python#UnderstandingVideos). Citando esta página:Na mesma página esta informação encontra-se sobre o título Video entry contents.

Consegui sacar a duração dos videos tal como disseste, mas a parte de abrir o firefox em background é que não funciona :( tenho que ver se arranjo alguma forma de isto funcionar como quero, só falta mesmo isso para ficar pronto :cheesygrin:
#!/usr/bin/env python
import os
import sys
import time
import subprocess
import gdata.youtube
import gdata.youtube.service
yt_service = gdata.youtube.service.YouTubeService()
#pid1=os.getppid();
#print ("pid pai: ", pid1)
#pidfilho=os.getpid();
#print ("pid filho: ", pidfilho)
fich = open("listas", "r")
for line in fich:
p = subprocess.Popen(["firefox", "-no-remote", "-P", "youtu", line],shell=False)
bra = p.pid
idfil = line.split('=')
entry = yt_service.GetYouTubeVideoEntry(video_id=idfil[1])
durac = int(entry.media.duration.seconds) + 5
print durac
print "process id do ff: ", bra
#por o firefox em background, nao sei se sera possivel...
time.sleep(durac)
p.kill()
fich.close()
print "fim"

Edited by Dr_Lion

Share this post


Link to post
Share on other sites
Pedro C.

Bem, de facto fiz uma procura rápida na net e parece não haver solução para estar a correr o firefox (que é um interface, não um serviço) em background (pelo menos fácil de encontrar). Não sei se precisas mesmo de correr o firefox ou se precisas apenas de aceder a um link.

De qualquer das maneira, e compreendo que não seja a solução mais graciosa, podes considerar temporariamente definir as propriedades do firefox como a abertura sendo minimizada. Penso que desta maneira te vão aparecer as tabs cá em baixo mas a quase totalidade do monitor pode continuar a ser utilizada.

Pessoalmente eu tentaria substituir a utilização do firefox por outra coisa que fosse mais controlável (que eu não sei o que é, talvez outra pessoa com mais experiência em net programming).

Share this post


Link to post
Share on other sites
Dr_Lion

Pois, a ideia é reproduzir video/musicas do youtube. Estava a pensar no vlc, mas é capaz de acontecer o mesmo por ser gráfico.. Talvez arranjar um player que corra na consola?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.