可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Without using the new 2.6 subprocess module, how can I get either os.popen or os.system to execute my commands using the tcsh instead of bash? I need to source some scripts which are written in tcsh before executing some other commands and I need to do this within python2.4.
EDIT Thanks for answers using 'tcsh -c', but I'd like to avoid this because I have to do escape madness. The string will be interpreted by bash and then interpreted by tcsh. I'll have to do something like:
os.system("tcsh -c '"+re.compile("'").sub(r"""'"'"'""",my_cmd)+"'")
Can't I just tell python to open up a 'tcsh' sub-process instead of a 'bash' subprocess? Is that possible?
P.S. I realize that bash is the cat's meow, but I'm working in a corporate environment and I'm going to choose to not fight a tcsh vs bash battle -- bigger fish to fry.
回答1:
os.system()
calls system(3)
directly, and this system call is the one that "chooses" the shell. I put that in quotes, because system(3)
will always execute /bin/sh
.
Thus, if you want Python to use a different shell, you have several options:
Change the symlink /bin/sh
to point to tcsh
. This will have an effect on the whole system, which shouldn't be a problem since scripts that need bash features should start with /bin/bash
anyway.
Run your Python script from a chroot
environment where /bin/sh
points to tcsh
.
Replace /bin/sh
with a script that executes bash
or tcsh
depending on who calls it (you could, for example, pass an additional environment variable.)
Put everything you want to execute in tcsh
in a separate shell script and call that with os.system('tcsh -c...')
. This way you don't have to escape anything.
回答2:
Just prefix the shell as part of your command. I don't have tcsh installed but with zsh:
>>> os.system ("zsh -c 'echo $0'") zsh 0
回答3:
How about:
>>> os.system("tcsh your_own_script")
Or just write the script and add
#!/bin/tcsh
at the beginning of the file and let the OS take care of that.
回答4:
Just set the shell to use to be tcsh
:
>>> os.environ['SHELL'] = 'tcsh' >>> os.environ['SHELL'] 'tcsh' >>> os.system("echo $SHELL") tcsh