I've made selfdestruct function that create a batch file that deletes the executable. It works when running the python file and the batch file opens normally. But after compiling it to an exe using pyinstaller it doesn't open.
I tried this
import os, sys
batchFilePath = 'C:\\Users\\Admin\\Desktop\\selfDelete.bat'
pathofscript = sys.argv[0]
batchCode = f'del /F /Q {pathofscript}'
with open(batchFilePath, 'w') as f:
f.write(batchCode)
f.close()
os.startfile(batchFilePath)
Use sys.executable when targeting the executable. However your should note that when running the code as a python script sys.executable points to python.exe. So running your code as a python script would delete your python executable.
As such, I suggest testing to make sure that the code is being run from the compiled executable before executing the portion that actually runs the batch file. I have included an example of this below.
import os, sys, pathlib
batchFilePath = pathlib.Path.home() / "Desktop" / 'selfDelete.bat'
if pathlib.Path(__file__).parent.name.startswith("_MEI"):
batchFilePath.write_text(f'del /F /Q {sys.executable}')
os.startfile(batchFilePath)
Related
How would I open a specific file in IDLE through a python script?
I understand that an app could be opened through subprocess:
import subprocess
subprocess.call('C:\\program.exe')
But I can't figure out how to make it open a file.
If it helps, this:
import os.path
import sys
# Enable running IDLE with idlelib in a non-standard location.
# This was once used to run development versions of IDLE.
# Because PEP 434 declared idle.py a public interface,
# removal should require deprecation.
idlelib_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if idlelib_dir not in sys.path:
sys.path.insert(0, idlelib_dir)
from idlelib.pyshell import main
main()
also opens IDLE. I checked, and main() does not take any parameters such as files to open.
I am using Windows 10 with Python 3.6.4.
Any help is greatly appreciated.
Here are 2 ways to open any python file through IDLE
import subprocess
p = subprocess.Popen(["idle.exe", path_to_file])
# ... do other things while idle is running
returncode = p.wait() # wait for notepad to exit
OR:
import subprocess
import os
subprocess.call([path_to_idle, path_to_file])
You can also use these methods to open any file with any installed app (How can I open files in external programs in Python?)
One can run IDLE from a command line on any platform with <python> -m idlelib <IDLE args>, where <python> could be 'python', 'python3', or something line 'py -3.8', depending on the platform. <IDLE args> are defined in the "Command line usage" subsection of the IDLE doc, also available within IDLE as Help => IDLE Help.
A possible 'IDLE arg' is the path of a file to be opened in an editor window. Relative paths are relative to the current working directory, which can be changed with the 'cd' command. A working command line can used quoted or turned into a list for a subprocess.run or subprocess.Popen call. In Python code, the working directory is changed with os.chdir('newdir').
I'm trying to write a .py script that takes in another file as a command argument, with the cmd-argument file in the same directory as said script.
What I have so far is:
import sys
java_file = open(sys.argv[1],"r")
<rest of file>
Which works fine if I have a command-line argument like this:
python.exe "D:\<user>\<more file directories>\balanced.py" "D:\<user>\<same file directories>\Driver.java"
What I'd like to do is have the command-line argument be something like:
python.exe "D:\<user>\<more file directories>\balanced.py" Driver.java
Running on Windows 10 command prompt using Python 3.7.3.
on Windows, sys.argv[0] should be the full path to your script, so you can use os.path.split(sys.argv[0])[0] to get the path, then os.path.join() to join it
import sys, os
java_file = open(os.path.join(os.path.split(sys.argv[0])[0], sys.argv[1]))
I make program in python to open some executable file given by path. I use:
os.startfile(path)
to start program. When i run script.py in IDLE it works fine, but when i make .exe file with pyinstaller when i run it that program i want to open starts to open and closes almost immediately. I tried with different functions like subprocess.Popen(path) and it does the same thing, open and close program after 1 second. Can someone help me? Is there a problem in python functions or in pyinstaller or even windows 10?
The problem is that your code most likely just runs and then the window closes.
You can add import time to your imports and time.sleep(x) or something to keep the window open for x seconds after you run
Read all the way through before doing anything!
Ok so try this:
Put this in a python file called start.py:
import os
import subprocess
#py_command - whatever opens python in cmd
#path - must be full path of file you want to call
def StartPythonScript(path, py_command):
command = 'start cmd /k ' + py_command + " " + path
subprocess.run(command, shell=True)
Now, take the code from file you are calling from the exe, let's say its name is run.py, and put it in a different file, say code.py.
Make sure start.py is in the same folder as run.py
In run.py, put this:
import start
cmd = "py" #change this to whatever opens python in cmd
path = "code.py" #change to the full path of code.py
start.StartPythonScript(path, cmd)
So when you click on the exe, it opens run.py which tells start.py to open code.py, which contains your program.
You can actually merge start.py and run.py, but you can reuse start.py if they are seperate.
OR...
Add import os to your program that is called by the exe.
Add os.system("pause") to the end of your program.
I'm not sure if this will work on an infinitely running program...but try this first to save time.
More info:
How to stop Python closing immediately when executed in Microsoft Windows
Good luck!
I am trying to run 3 python programs simultaneously by running a single python program
I am using the following script in a separate python program sample.py
Sample.py:
import subprocess
subprocess.Popen(['AppFlatRent.py'])
subprocess.Popen(['AppForSale.py'])
subprocess.Popen(['LandForSale.py'])
All the three programs including python.py is in the same folder.
Error: OSError: [Errno 2] No such file or directory
Can someone guide me how can i do it using subprocess.Popen method?
The file cannot be found because the current working directory has not been set properly. Use the argument cwd="/path/to/script" in Popen
It's because your script are not in the current directory when you execute sample.py.
If you three script are in the same directory than sample.py, you could use :
import os
import subprocess
DIR = os.path.dirname(os.path.realpath(__file__))
def run(script):
url = os.path.join(DIR, script)
subprocess.Popen([url])
map(run, ['AppFlatRent.py','AppForSale.py', 'LandForSale.py'])
But honestly, if i was you i will do it using a bash script.
There might be shebang missing (#!..) in some of the scripts or executable permission is not set (chmod +x).
You could provide Python executable explicitly:
#!/usr/bin/env python
import inspect
import os
import sys
from subprocess import Popen
scripts = ['AppFlatRent.py', 'AppForSale.py', 'LandForSale.py']
def realpath(filename):
dir = os.path.realpath(os.path.dirname(inspect.getsourcefile(realpath)))
return os.path.join(dir, filename)
# start child processes
processes = [Popen([sys.executable or 'python', realpath(scriptname)])
for scriptname in scripts]
# wait for processes to complete
for p in processes:
p.wait()
The above assumes that script names are given relative to the module.
Consider importing the modules and running corresponding functions concurently using threading, multiprocessing modules instead of running them as scripts directly.
I am working on an auto restart script for an exe but there are config files in the directory I need to run with the exe. If I start the exe from the actual file folder it works fine but when I use the script to run the exe it starts the exe without the configuration files. What can I add to this script to use all files in the directory?
import os, subprocess, time
while True:
print("Starting process...")
p = subprocess.Popen("C:\\Users\\my-pc\\Desktop\\process\\process.exe")
time.sleep(7200)
print("Terminating process...")
p.terminate()
time.sleep(10)
You should set cwd parameter of Popen constructor to the working directory of the process, e.g.:
p = subprocess.Popen("C:\\Users\\my-pc\\Desktop\\process\\process.exe", cwd="C:\\Users\\my-pc\\Desktop\\process")
You may also find useful the official documentation of subprocess.Popen.
You should be able to call Popen with a "cwd" keyword argument that should pickup the configuration files.