3

I am having problems outputting a command to a running screen.

Using the following code:

import subprocess
subprocess.call(["screen", "-S jcmp", "-X stuff", "'kick Jman100'`echo -ne '\015'`"])

returns the following:

Use: screen [-opts] [cmd [args]]
 or: screen -r [host.tty]

Options:
-a            Force all capabilities into each window's termcap.
-A -[r|R]     Adapt all windows to the new display width & height.
-c file       Read configuration file instead of '.screenrc'.
-d (-r)       Detach the elsewhere running screen (and reattach here).
-dmS name     Start as daemon: Screen session in detached mode.
-D (-r)       Detach and logout remote (and reattach here).
-D -RR        Do whatever is needed to get a screen session.
-e xy         Change command characters.
-f            Flow control on, -fn = off, -fa = auto.
-h lines      Set the size of the scrollback history buffer.
-i            Interrupt output sooner when flow control is on.
-l            Login mode on (update /var/run/utmp), -ln = off.
-list         or -ls. Do nothing, just list our SockDir.
-L            Turn on output logging.
-m            ignore $STY variable, do create a new screen session.
-O            Choose optimal output rather than exact vt100 emulation.
-p window     Preselect the named window if it exists.
-q            Quiet startup. Exits with non-zero return code if unsuccessful.
-r            Reattach to a detached screen process.
-R            Reattach if possible, otherwise start a new session.
-s shell      Shell to execute rather than $SHELL.
-S sockname   Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title      Set title. (window's name).
-T term       Use term as $TERM for windows, rather than "screen".
-U            Tell screen to use UTF-8 encoding.
-v            Print "Screen version 4.00.03jw4 (FAU) 2-May-06".
-wipe         Do nothing, just clean up SockDir.
-x            Attach to a not detached screen. (Multi display mode).
-X            Execute <cmd> as a screen command in the specified session.

Error: Unknown option S jcmp
1
>>> subprocess.call(["screen", "-s jcmp", "-X stuff", "'command here'`echo -ne '\015'`"])
Use: screen [-opts] [cmd [args]]
 or: screen -r [host.tty]

Options:
-a            Force all capabilities into each window's termcap.
-A -[r|R]     Adapt all windows to the new display width & height.
-c file       Read configuration file instead of '.screenrc'.
-d (-r)       Detach the elsewhere running screen (and reattach here).
-dmS name     Start as daemon: Screen session in detached mode.
-D (-r)       Detach and logout remote (and reattach here).
-D -RR        Do whatever is needed to get a screen session.
-e xy         Change command characters.
-f            Flow control on, -fn = off, -fa = auto.
-h lines      Set the size of the scrollback history buffer.
-i            Interrupt output sooner when flow control is on.
-l            Login mode on (update /var/run/utmp), -ln = off.
-list         or -ls. Do nothing, just list our SockDir.
-L            Turn on output logging.
-m            ignore $STY variable, do create a new screen session.
-O            Choose optimal output rather than exact vt100 emulation.
-p window     Preselect the named window if it exists.
-q            Quiet startup. Exits with non-zero return code if unsuccessful.
-r            Reattach to a detached screen process.
-R            Reattach if possible, otherwise start a new session.
-s shell      Shell to execute rather than $SHELL.
-S sockname   Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title      Set title. (window's name).
-T term       Use term as $TERM for windows, rather than "screen".
-U            Tell screen to use UTF-8 encoding.
-v            Print "Screen version 4.00.03jw4 (FAU) 2-May-06".
-wipe         Do nothing, just clean up SockDir.
-x            Attach to a not detached screen. (Multi display mode).
-X            Execute <cmd> as a screen command in the specified session.

Error: Unknown option S jcmp

"jcmp" is the name of the screen session that was previously launched using an os.system() call

2
  • 3
    The answer by kindall is correct. But if you trust the command, then (& then only) You can use Shell=True option, in which case, you can provide the command as single string "...", instead of list [..., ...]. Similarly, you can have list as ["bash", "-c", "your entire command with args"]. Commented Jun 30, 2014 at 6:36
  • And if you don't want to use the shell, you can still use a single string and use shlex.split to break it up as the shell would, then pass that to subprocess.call. Commented Mar 17, 2015 at 16:56

1 Answer 1

14

You're getting that message because you are not passing the arguments correctly. Each argument should be an individual string in the list. That is, -S jcmp should not be a single argument but two; same for -X stuff.

subprocess.call(["screen", "-S",  "jcmp", "-X", "stuff", "'kick Jman100'`echo -ne '\015'`"])
Sign up to request clarification or add additional context in comments.

1 Comment

I have a similar problem although I do exactly as you say: aws_command = ["aws","sqs","receive-message","--queue-url",queue_url,"--message_attribute_names", "data"] it prints out the error as "-message_attribte_names" and "data" are unknown arguments. But they do output the result correctly when typed directly into terminal –

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.