Python Forum
Subprocess.Popen() not working when reading file path from csv file
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Subprocess.Popen() not working when reading file path from csv file
#1
I am a beginner at python coding.

I wrote a simple code that lists a number of programs and asks the user to choose one of the programs. It will then open a website with the version history of that program, and, where it exists, run the updater of the program.

Initially I wrote the program manually writing out the list of programs (20) and then manually write out the url and, where relevant, the path and file name to the updater. Something like:

if choice == 1
   url = 'https://blablabla'
   prg = 'C:\\Program Files\\blablabla'
After manually defining the URL and prg variables for all 20 options, I run:

webbrowser.open_new_tab(url)
subprocess.Popen(prg)
This works fine.

Then I tried to write the code where the list of programs and the url and file paths are listed in a .csv file. The values for the url and prg variables are read from the .csv file (using numpy load.txt)

webbrowser.open_new_tab(url)
works fine

However:

subprocess.Popen(prg)
gives an error message if the file path has a blank space in it (which is in 19 out of the 20 options). The error message is:

Error:
Traceback (most recent call last): File "test.py", line 32, in <module> mainmenu() File "test.py", line 30, in mainmenu subprocess.Popen(prg) File "C:\Users\zorin\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 858, in _init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\zorin\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1311, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] The system cannot find the file specified
One example:

In the original (long-winded)code I manually set the full file name for Chrome:
prg = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
and

subprocess.Popen(prg)
runs Chrome without a problem.

In the updated code the same full file name is read into prg, but this time

subprocess.Popen(prg)
gives the above-mentioned error code (if the file path has a black space it).

In the new code
print(prg)
will give:
Output:
C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe
so the correct value is read into the variable.

Any suggestions what I am doing wrong?

I use Windows
Reply
#2
Try subprocess.Popen([prg]) perhaps.
Reply
#3
(May-03-2021, 07:51 PM)herwin Wrote: In the new code

print(prg)
will give:
Output:
C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe
so the correct value is read into the variable.

No it is not correct. The path should be: "C:\Program Files\Google\Chrome\Application\chrome.exe", so without the double backlashes.
The backslash has a special meaning in Python. So to assign a string literal with backslashes you have to double the backslash to make clear you really mean one backslash.
>>> prg = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
>>> print(prg)
C:\Program Files\Google\Chrome\Application\chrome.exe
So "prg" will contain only single backslashes.
Nowadays a more popular way to assign such a variable is to assign a raw string by putting an "r" before the string literal.
>>> prg = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
>>> print(prg)
C:\Program Files\Google\Chrome\Application\chrome.exe
So make sure you get rid of the double backslashes.
Reply
#4
(May-03-2021, 07:51 PM)herwin Wrote: gives the above-mentioned error code (if the file path has a black space it).

In the new code
print(prg)
Do print(repr(prg)) then you see if there is a space.
It's normal when read from file eg csv to use strip() so there no space at beginning or end.
>>> path = r'C:\code\file.csv '
# Looks ok,but are not
>>> print(path)
C:\code\file.csv 
>>> 
>>> # To see all
>>> print(repr(path))
'C:\\code\\file.csv '
>>> 
>>> # Fix
>>> path.strip()
'C:\\code\\file.csv'
Reply
#5
(May-03-2021, 09:15 PM)Gribouillis Wrote: Try subprocess.Popen([prg]) perhaps.

Thank you for your answer.

Unfortunately the problem remains the same
Reply
#6
(May-04-2021, 08:28 AM)ibreeden Wrote:
(May-03-2021, 07:51 PM)herwin Wrote: In the new code

print(prg)
will give:
Output:
C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe
so the correct value is read into the variable.

No it is not correct. The path should be: "C:\Program Files\Google\Chrome\Application\chrome.exe", so without the double backlashes.
The backslash has a special meaning in Python. So to assign a string literal with backslashes you have to double the backslash to make clear you really mean one backslash.
>>> prg = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
>>> print(prg)
C:\Program Files\Google\Chrome\Application\chrome.exe
So "prg" will contain only single backslashes.
Nowadays a more popular way to assign such a variable is to assign a raw string by putting an "r" before the string literal.
>>> prg = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
>>> print(prg)
C:\Program Files\Google\Chrome\Application\chrome.exe
So make sure you get rid of the double backslashes.

Thank you for your response and suggestions.

I have tried with the single and double backslashes in the csv file. The error message stays the same in both cases.

How do I read the values from the csv file into the prg variable as a raw string?
Reply
#7
(May-04-2021, 09:54 AM)snippsat Wrote:
(May-03-2021, 07:51 PM)herwin Wrote: gives the above-mentioned error code (if the file path has a blank space it).

In the new code
print(prg)
Do print(repr(prg)) then you see if there is a space.
It's normal when read from file eg csv to use strip() so there no space at beginning or end.
>>> path = r'C:\code\file.csv '
# Looks ok,but are not
>>> print(path)
C:\code\file.csv 
>>> 
>>> # To see all
>>> print(repr(path))
'C:\\code\\file.csv '
>>> 
>>> # Fix
>>> path.strip()
'C:\\code\\file.csv'

Thanks.

I check as per your suggestion and there are no spaces at the beginning or the end of the string.
The problem appears to be the blank space in the middle of the string (between 'program' and 'files' in the file path)
Reply
#8
Have you tried Popen([prg]) instead of Popen(prg) ? The less ambiguous way to call Popen() is to pass a list of the arguments.
Reply
#9
(May-04-2021, 03:42 PM)Gribouillis Wrote: Have you tried Popen([prg]) instead of Popen(prg) ? The less ambiguous way to call Popen() is to pass a list of the arguments.

Thanks.
Yes, I did. Unfortunately that does not seem to solve the problem (I get the same error message)
Reply
#10
(May-04-2021, 03:30 PM)herwin Wrote: The problem appears to be the blank space in the middle of the string (between 'program' and 'files' in the file path)
Should not be a problem,a quick test.
So this run fine no error,and open programs.
import subprocess

core = r'C:\Program Files\Core Temp\Core Temp.exe'
prg = r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
print(repr(core))
print(repr(prg))
subprocess.Popen([core])
subprocess.Popen([prg])
Output:
E:\div_code\new λ python p_open.py 'C:\\Program Files\\Core Temp\\Core Temp.exe' 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
If put paths is a file,run fine.
Output:
# prog.csv C:\Program Files\Core Temp\Core Temp.exe,C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
import subprocess
import csv

with open('prog.csv') as f:
    reader = csv.reader(f, delimiter=',')
    prog_lst = list(reader)

for prog in prog_lst[0]:
    subprocess.Popen([prog])
so prog_lst looks like this,se that there are two \\ when read from a file,
then there is no need for r(raw string) as if write/copy path yourself.
>>> prog_lst
[['C:\\Program Files\\Core Temp\\Core Temp.exe',
  'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe']]
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  File Handling not working properly TheLummen 8 560 Feb-17-2024, 07:47 PM
Last Post: TheLummen
  Absolute paths in subprocess - file not found kittyticker 4 397 Jan-28-2024, 10:37 PM
Last Post: kittyticker
  file open "file not found error" shanoger 8 939 Dec-14-2023, 08:03 AM
Last Post: shanoger
Information subprocess.Popen() suddenly giving me grief? davecotter 3 529 Dec-13-2023, 10:49 PM
Last Post: davecotter
  working directory if using windows path-variable chitarup 2 679 Nov-28-2023, 11:36 PM
Last Post: chitarup
Sad problems with reading csv file. MassiJames 3 559 Nov-16-2023, 03:41 PM
Last Post: snippsat
  Use PM4PY and create working file thomaskissas33 0 572 Nov-14-2023, 06:53 AM
Last Post: thomaskissas33
  Reading in of line not working? garynewport 2 784 Sep-19-2023, 02:22 PM
Last Post: snippsat
  Need to replace a string with a file (HTML file) tester_V 1 698 Aug-30-2023, 03:42 AM
Last Post: Larz60+
  Reading a file name fron a folder on my desktop Fiona 4 851 Aug-23-2023, 11:11 AM
Last Post: Axel_Erfurt

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020