I have a simple tkinter GUI with a dropdown, that when selected, runs a function. I know the anaconda prompt and cmd line are different, however, I can't get the command to work inside the python script without using the external batch file.
I am reading from a folder of csv files to get the list and all that is fine.
Currently, this works:
import tkinter as tk
import os
folder = 'C:/Users/[user]/Desktop'
OptionList = [fname for fname in os.listdir(folder) if fname.endswith('.csv')]
app = tk.Tk()
app.geometry('500x200')
variable = tk.StringVar(app)
variable.set(OptionList[0])
opt = tk.OptionMenu(app, variable, *OptionList)
opt.config(width=500, font=('Helvetica', 12))
opt.pack(side="top")
def callback(*args):
os.system('cmd /k "C:\\Users\\[user]\\Desktop\\notebook_launch.bat"')
app.destroy()
variable.trace("w", callback)
app.mainloop()
Here is the working batch file:
#echo on
call C:\ProgramData\Anaconda3\Scripts\activate.bat
voila "C:\Users\[user]\Documents\notebook.ipynb"
When I try to execute the commands from windows cmd, if I use /k instead of /c to keep the window open, I can see that the anaconda prompt opens, however the next line of code does not execute.
Attempt at getting both commands to run in the script:
def callback(*args):
os.system('cmd /c "C:\\ProgramData\\Anaconda3\\Scripts\\activate.bat"')
os.system('cmd /c "voila C:\\Users\\[user]\\Documents\\notebook.ipynb"')
app.destroy()
Alternate attempt, same result:
def callback(*args):
os.system('cmd /c "C:\\ProgramData\\Anaconda3\\Scripts\\activate.bat" && "voila C:\\Users\\[user]\\Documents\\notebook.ipynb"')
app.destroy()
Noted above, I have also tried using && to combine the commands in one line, but same result, only the anaconda prompt opens and the "voila" command does not execute.
Anyone know what I'm missing or if it possible? My guess is that since the (base) prompt is opening, the os.system function doesn't know what to do with the anaconda prompt. Any help is appreciated.
EDIT:
Turns out I just needed to pause the execution for half a second, as it was executing too quickly. By adding import time and squeezing time.sleep(.5) between the two lines, everything functioned perfectly.
Functioning code:
import time
def callback(*args):
os.system('cmd /c "C:\\ProgramData\\Anaconda3\\Scripts\\activate.bat"')
time.sleep(.5)
os.system('cmd /c "voila C:\\Users\\[user]\\Documents\\notebook.ipynb"')
app.destroy()
Turns out I just needed to pause the execution for half a second, as it was executing too quickly. By adding import time and squeezing time.sleep(.5) between the two lines, everything functioned perfectly.
Functioning code:
import time
def callback(*args):
os.system('cmd /c "C:\\ProgramData\\Anaconda3\\Scripts\\activate.bat"')
time.sleep(.5)
os.system('cmd /c "voila C:\\Users\\[user]\\Documents\\notebook.ipynb"')
app.destroy()
Related
here is my code
def test_login(self):
URL = (sys.argv[0])
Username = (sys.argv[1])
Password = (sys.argv[2])
self.driver.get(URL)
print ("Browser launched")
self.driver.find_element(By.NAME, "username").send_keys(Username)
self.driver.find_element(By.CLASS_NAME, "btn-login-submit").click()
time.sleep(7)
self.driver.find_element(By.NAME, "password").send_keys(Password)
self.driver.find_element(By.CLASS_NAME, "btn-login-submit").click()
time.sleep(10)
print('login successful')
how to run in the vscode terminal
i could not get the proper command line to run in terminal
Try the following:
Copy Paste the code in a .py file say test.py
I do not see the calling of the function (test_login). So call it or remove the function if it is not necessary.
in the VS code terminal, type this command Python3 test.py to execute your python script.
i have this layout
1/mainy.py
2/main.py
3/main.py
........
i wish to run each "main" in its own idle window. not a cmd line because if it crashes i tend to lose the output.
so far i have
for i in range(150):
i+=1 # because theres no zero folder
exec(open(str(i)+"/"+'main.py').read()) # if i run this in idle it tries to run them in the same idle window
i want to have many different idle windows simultaneaously. right now i have to open each manually but i want a script to do it.
i very specfically want each one running in its own idle window so i should have 8 (9 including the one that opens the rest) windows open.
If you don't need to collect output from each idle, you can use subprocess.Popen
from subprocess import *
import os
#Loop over and change script name
for i in range(150):
script_name = os.path.join(str(i), "main.py")
print('script launching:', script_name)
subprocess.Popen("start python " + script_name, stdin=PIPE, stderr=PIPE, stdout=PIPE, shell=True)
You can open each Python script in separate window using this:
import subprocess
import time
import pyautogui
for i in range(150):
i+=1 # because theres no zero folder
subprocess.call([ 'C:/Users/tgmjack/AppData/Local/Programs/Python/Python37-32/Lib/idlelib/idle.bat', str(i)+"/"+'main.py'])
time.sleep(2)
pyautogui.press('f5')
time.sleep(2)
Change the first path to match where idle.bat is located and the second according to your Python script.
You can loop through the scripts but you have to use PyAutoGUI package to press F5 to run each script programmatically.
Refer to https://pypi.org/project/PyAutoGUI/
Im trying to run a exe with some arguments within python using subprocesses Popen but the code is currently printing nothing as the output and a CMD window doesnt open when i run the file.
I know the command works as i manually paste it within CMD and it runs perfectly fine, what could i be doing wrong in my code?
import sys
import admin
import subprocess
from subprocess import Popen, PIPE
Path_2to3 = sys.executable[:-11] + "Scripts"
cmdCommand = '''cd "{}" && 2to3.exe -w "C:/Users/Desktop/bulk_converter/tests/test2.py"'''.format(Path_2to3)
process = subprocess.Popen(cmdCommand, stdout=subprocess.PIPE, shell=True)
output, error = process.communicate()
print(output, error)
retured values from print(output,error)
b'' None
Any help/suggestions would be appreciated.
Hi perhaps also specify stderr should be redirected to a pipe:
stderr=subprocess.PIPE
You may also be interested in passing a timeout parameter to communicate.
I run the python script using terminal command
python3 myScript.py
It's simply run my program but if i want to open python console after complete run of my script so that i can access my script's variables.
So, What should i do ? and How can i get my script's variables after run the code using terminal ?
Open a python terminal (type 'python' in cmd);
Paste this (replace 'myScript.py' with your script filename):
def run():
t = ""
with open('myScript.py') as f:
t = f.read()
return t
Type exec(run()). Now you will have access to the variables defined in myScript.py.
I needed to do this so I could explore the result of a request from the requests library, without having to paste the code to make the requests every time.
Make the program run the other program you want with the variables as arguments. For example:
#program1
var1=7
var2="hi"
import os
os.system("python %s %d %s" % (filename, var1, var2))
#program2
import sys
#do something such as:
print(sys.argv[1]) #for var1
print(sys.argv[2]) #for var2
Basically, you are running program2 with arguments that can be referenced later.
Hope this helps :)
I've been working on a filebrowser application, and I'd like the first column (file name) to be resized properly on startup. I can type the following code at the python prompt and the column resizes properly, but when I put it in a file and try to run it, the column is not resized. Any idea why?
#!/bin/env python
import sys
import os
from PyQt4.QtGui import *
app = QApplication(sys.argv)
treeView = QTreeView()
fileSystemModel = QFileSystemModel(treeView)
rootDir = fileSystemModel.setRootPath(os.path.expanduser('~'))
treeView.setModel(fileSystemModel)
treeView.setRootIndex(rootDir)
treeView.setGeometry(100,100,1024,768)
treeView.show()
treeView.resizeColumnToContents(0)
app.exec_()
Of course, when I copy it to the python prompt, I leave off the app.exec_(). Is that what is causing the column to not resize? (EDIT: I copied "app.exec_()" to the prompt and it did pretty much what you'd expect - the event loop started, and I was able to use the app, then close it, and then I was returned to the python prompt.)
It seems that replacing the call to treeView.resizeColumnToContents(0) with treeView.header().setResizeMode(0, QHeaderView.ResizeToContents) results in the column being expanded when run from the Python prompt and from a script. I have no clue why resizeColumnToContents is not working as intended.
Side note: should #!/bin/env python be #! /usr/bin/env python? At least on my distro, /bin/env doesn't exist.