So I have a python script that generates a file name based on the time. Then I am trying to cat some data into that file name. However, it seems that I cannot pass it in or something.
Here is what the code looks like:
fileName = "parsedOn_"+strftime("%Y_%m_%d_%H%M%S", gmtime())+".csv"
subprocess.call(['cat' + 'xaa' + '>' + fileName])
Here is the error I get:
Traceback (most recent call last):
File "parseCSV.py", line 96, in <module>
subprocess.call(['cat' + 'xaa' + '>' + finalFile1])
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 444, in call
return Popen(*popenargs, **kwargs).wait()
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 595, in __init__
errread, errwrite)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 1106, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Any ideas if what I'm trying to do is possible with subprocess at all?
The problem lies in
subprocess.call(['cat' + 'xaa' + '>' + fileName])
First of all, you're missing spaces (if you wanted to use a string), or commas (if you wanted to use a list, the preferred method). Secondly, > is a shell redirection, so you must execute this line in a shell, as in:
subprocess.call('cat xaa > ' + fileName, shell=True)
But you should not do that. Instead, use Python's native shutil.copyfile:
shutil.copyfile('xaa', fileName)
You should consider using envoy.
Sample
In [1]: import envoy
In [2]: r = envoy.run("cat requirements.txt")
In [3]: r.std_out
Out[3]: 'Flask==0.8\ngit+git://github.com/kennethreitz/flask-cache.git\nJinja2==2.6\ngit+git://github.com/kennethreitz/werkze ug.git\ndistribute==0.6.24\ngunicorn==0.13.4\nredis==2.4.9\nvanity==1.1.1\nwsgiref==0.1.2\n'
In [4]: print r.std_out
Flask==0.8
git+git://github.com/kennethreitz/flask-cache.git
Jinja2==2.6
git+git://github.com/kennethreitz/werkzeug.git
distribute==0.6.24
gunicorn==0.13.4
redis==2.4.9
vanity==1.1.1
wsgiref==0.1.2
Edit:
Main advantage of envoy is simplicity.
Related
I am trying to follow this blog on how to execute an R script from Python. I have the R script working fine from the command line using Rscript.
Here's my Python code:
import subprocess
import os
command = "C:\Program Files\R\R-3.4.4\bin\Rscript"
path2script = os.getcwd() + "\max.R" # gives me the absolute path to the R script
args = ["11", "3", "9", "42"]
cmd = [command, path2script] + args
x = subprocess.check_output(cmd, universal_newlines = True)
Which gives me this error:
FileNotFoundError: [WinError 2] The system cannot find the file specified
I've read a lot of SO posts on this error and in most cases it seems to be a problem with trying to invoke system commands like dir or passing arguments to check_output in the wrong order but in my case I really don't see what should be going wrong.
Following some of the advice I've tried building a string for cmd instead of a list, and then passing it to check_output using the argument shell = True - when I do that I get a CalledProcessError: returned non-zero exit status 1.
I'm assuming this code, which is exactly as it appeared on the blog other than adding the absolute path to the file, is failing now because the behaviour of check_output has changed since 2015...
Can anyone help?
Here's the stack trace:
Traceback (most recent call last):
File "<ipython-input-2-3a0151808726>", line 1, in <module>
runfile('C:/Users/TomWagstaff/Documents/Raising IT/Projects/15 AdWords/Python_R_test/run_max.py', wdir='C:/Users/TomWagstaff/Documents/Raising IT/Projects/15 AdWords/Python_R_test')
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/TomWagstaff/Documents/Raising IT/Projects/15 AdWords/Python_R_test/run_max.py", line 31, in <module>
x = subprocess.check_output(cmd, universal_newlines = True)
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 336, in check_output
**kwargs).stdout
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 403, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\site-packages\spyder\utils\site\sitecustomize.py", line 210, in __init__
super(SubprocessPopen, self).__init__(*args, **kwargs)
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 709, in __init__
restore_signals, start_new_session)
File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 997, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
check that you have a right path for command and script
print(os.path.exists(command))
print(os.path.exists(path2script))
note that writing path with backslashes may be dangerous as you can create escape sequence that way which will be interpreted in different way. You can write windows paths with forward slashes and then call os.path.normpath on them, turning them into safe form
(also in command you can use forward slashes only, Python interpret doesn't really care. In path to your R script that would be probably problem though)
So, I made a command called jel, which is executable as jel. It is run in Python, and when I run jel doctor, in jel.py it gives me a error(the main file). The code looks like this: Note that all necessary modules are already imported.
elif arg == 'doctor':
subprocess.call(['cd', 'js'])
ver = subprocess.call(['node', 'version.js'])
subprocess.call(['cd', '..'])
if not ver == version:
print 'jel doctor: \033[91found that version\033[0m ' + str(version) + ' \033[91mis not the current version\033[0m'
print 'jel doctor: \033[92mrun jel update\033[0m'
sys.exit()
The js file version.js is run on node, and looks like this: All necessary packages are installed
var latest = require('latest');
latest('jel', function(err, v) {
console.log(v);
// => "0.0.3"
if (err) {
console.log('An error occurred.');
}
});
It is giving me this error when the jel.py file uses subprocess to call cs js and node version.js:
Traceback (most recent call last):
File "/bin/jel", line 90, in <module>
subprocess.call(['cd', 'js'])
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
bjskistad:~/workspace (master) $ jel doctor
Traceback (most recent call last):
File "/bin/jel", line 90, in <module>
subprocess.call(['cd', 'js'])
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
I believe it is saying the directory doesn't exist, although it does. Do I need to call something else before?
There are at least three problems with your code snippet:
cd is a shell built-in, not an executable program. If you want to invoke cd, you'll need to invoke the shell.
The cd command only affects the shell in which it runs. It will have no effect upon the python program, or any subsequent subprocesses.
The return code from subprocess.call() is not the text that the program wrote to stdout. To get that text, try subprocess.check_output().
Try this:
#UNTESTED
elif arg == 'doctor':
ver = subprocess.check_output(['cd js && node version.js'], shell=True)
if not ver == version:
As already pointed out changing the directory is only reflected in the subprocess. You should use os.chdir to change your working directory but another alternative is to specify the cwd to subprocess which avoids any need to cd or os.chdir:
version = subprocess.check_output(['node', 'version.js'], cwd="js")
You should also use != in your if and you probably want to rstrip the newline:
if version != ver.rstrip():
I'm trying to pass these below chained commands at once to the subprocess.But it's throwing error.
Command to pass:
"C:\MyScript\run.bat" -I"C:\MyScript" -- "C:\MyScript\MyScript1.pl" "file_name"
where, file_name is a variable which holds the name of a file.
Code:
cmd = '"C:\MyScript\run.bat" -I"C:\MyScript" -- "C:\MyScript\MyScript1.pl"' + " " + filename
subprocess.call(cmd)
Error:
Traceback (most recent call last):
File "c:\Test\WWX_2.py", line 28, in
<module>
subprocess.call(cmd)
File "C:\Python26\lib\subprocess.py", line 444, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python26\lib\subprocess.py", line 595, in __init__
errread, errwrite)
File "C:\Python26\lib\subprocess.py", line 821, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
Use raw string literals to prevent \r from being interpreted as a carriage return. The space-only arguments are also passed as actual command line arguments, but you probably don't want that to happen, so remove them.
cmd = [r'C:\MyScript\run.bat', r'-I"C:\MyScript"', '--', r'C:\MyScript\MyScript1.pl', filename]
subprocess.call(cmd)
You have to escape all the backslashes in the path, i.e.
C:\\whatever\\batch.bat
I am trying to run a program to make some system calls inside Python code using subprocess.call() which throws the following error:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
My actual Python code is as follows:
url = "/media/videos/3cf02324-43e5-4996-bbdf-6377df448ae4.mp4"
real_path = "/home/chanceapp/webapps/chanceapp/chanceapp"+url
fake_crop_path = "/home/chanceapp/webapps/chanceapp/chanceapp/fake1"+url
fake_rotate_path = "/home/chanceapp/webapps/chanceapp.chanceapp/fake2"+url
crop = "ffmpeg -i %s -vf "%(real_path)+"crop=400:400:0:0 "+ "-strict -2 %s"%(fake_crop_path)
rotate = "ffmpeg -i %s -vf "%(fake_crop_path)+"transpose=1 "+"%s"%(fake_rotate_path)
move_rotated = "mv"+" %s"%(fake_rotate_path)+" %s"%(real_path)
delete_cropped = "rm "+"%s"%(fake_crop_path)
#system calls:
subprocess.call(crop)
Can I get some relevant advice on how to solve this?
Use shell=True if you're passing a string to subprocess.call.
From docs:
If passing a single string, either shell must be True or
else the string must simply name the program to be executed without
specifying any arguments.
subprocess.call(crop, shell=True)
or:
import shlex
subprocess.call(shlex.split(crop))
No such file or directory can be also raised if you are trying to put a file argument to Popen with double-quotes.
For example:
call_args = ['mv', '"path/to/file with spaces.txt"', 'somewhere']
In this case, you need to remove double-quotes.
call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']
Can't upvote so I'll repost #jfs comment cause I think it should be more visible.
#AnneTheAgile: shell=True is not required. Moreover you should not use
it unless it is necessary (see # valid's comment). You should pass
each command-line argument as a separate list item instead e.g., use
['command', 'arg 1', 'arg 2'] instead of "command 'arg 1' 'arg 2'". –
jfs Mar 3 '15 at 10:02
I am using the subprocess module to run a command in python. But the problem is that I also want to include a string (for a file name) in the command.
An example of what I want to do:
from subprocess import call
command = "cd/DirectoryName"
call = [(command)]
In this specific example I want DirectoryName to be a variable determined by the user.
What I have tried to no avail:
Desktop=raw_input()
cmd="'cd %s'(Desktop/)"
call([cmd])
Here's the error I get when I try to run these commands in the python shell.
Chicken='Chicken'
command = 'say %s' % (Chicken)
print command
say Chicken
call([command])
Traceback (most recent call last):
File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 1, in <module>
# Used internally for debug sandbox under external interpreter
File "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Just tried this and it made the shell crash.
Chicken="Chicken"
print Chicken
Chicken
call[("say %s" % (Chicken)]
That's not how string interpolation works.
cmd='cd %s' % (Desktop,)
First off,
cmd="'cd %s'(Desktop/)"
Doesn't seem like it would "printf" the %s.
Maybe
cmd="'cd %s/'%(Desktop)"
But I still don't know if that will interpolate since it's inside a string can using the "call" function and a python command -- wouldn't that call it on the command line?