我正在尝试从python构造并执行csh脚本。
我生成的代码看起来像是一个正确的脚本,os.system("my_script.csh")
返回'0',但脚本不执行中的任务,除非我手动进入它使用vim并重新保存(手动更改脚本中的任何内容 - 我甚至不进入'插入'模式)。什么是在我的代码中没有在vim中重新保存,是否可以这样做?
这是我的代码的相关部分:
grabmeName = '%sgrabme%s.csh'%(dirNames['grabmes'],uniqID)
if not os.path.exists(grabmeName):
open(grabmeName,'w').close()
os.chmod(grabmeName,0777)
with open(grabmeName,'a') as f:
f.write("#!/bin/csh -f\n")
f.write("echo 'hello'")
os.system(grabmeName)
答案 0 :(得分:2)
主要问题是shell中的每一行都需要以\n
结束才能执行,即使是最后一行。您只需将\n
添加到"echo 'hello'"
字符串的末尾即可。这可以说是csh
中的一个错误,因为bash
和朋友没有这个问题,但是如果你想使用csh
,你就必须容纳它。
当您在vim中保存文本文件时,如果没有开头的新文件,它会在文件中添加一个尾随换行符。您可以通过预先保存文件副本并运行diff
来查看vim更改来验证这一点:
$ cat blah-grabme-12.csh
#!/bin/csh -f
echo 'hello'$ cp blah-grabme-12.csh blah-grabme-12.csh.orig
$ vim blah-grabme-12.csh
┌────────────────────────────────────────────────────────────────────────────────┐
│#!/bin/csh -f │
│echo 'hello' │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│~ │
│:wq❚ │
└────────────────────────────────────────────────────────────────────────────────┘
$ diff -u blah-grabme-12.csh.orig blah-grabme-12.csh.orig
--- blah-grabme-12.csh.orig
+++ blah-grabme-12.csh
@@ -1,2 +1,2 @@
#!/bin/csh -f
-echo 'hello'
\ No newline at end of file
+echo 'hello'
如果您愿意,可以在~/.vimrc
中关闭vim的这种行为。请参阅vim帮助中的:help 'eol'
。
另一个潜在的问题是system(filename)
仅在filename
是非裸路径时才有效 - 即,其中有/
- 或者.
是否在系统$PATH
。
此外,通过使用os.open()
代替open()
,您可以在文件创建时设置文件权限。在这里它可能没有太大的区别,但在许多情况下,创建文件然后更改其权限会产生security vulnerability。 This stackoverflow question显示了如何做到这一点。
总而言之,你会得到这样的东西:
import os
import os.path
grabmeName = 'blah-grabme-12.csh'
with os.fdopen(os.open(grabmeName, os.O_WRONLY | os.O_CREAT, 0700), 'w') as f:
f.write("#!/bin/csh -f\n")
f.write("echo 'hello'\n")
os.system(os.path.abspath(grabmeName))
答案 1 :(得分:0)
你应该结帐subprocess它会显示很多例子。
output=`mycmd myarg`
# becomes
output = check_output(["mycmd", "myarg"])
您希望捕获命令的输出而不仅仅是返回状态。