【问题标题】:Running shell script from python从 python 运行 shell 脚本
【发布时间】:2016-08-28 15:17:13
【问题描述】:

我写了一个小python程序,它写了一个C-shell脚本,然后用子进程调用这个脚本。但是,python 无法执行脚本。我在终端中对此进行了测试,发现该脚本也不会从终端运行(即不是 python 问题)。进一步的测试表明,我可以在文本编辑器 (vi) 中编写相同的脚本,然后从终端成功执行它(即我认为脚本的内容没有问题)。最终我发现,如果我尝试使用./myscript.com 直接在终端中运行 python 的输出,它将运行。但是,如果我用 vi 打开,进行 NO 更改,保存然后使用./myscript.com(即完全相同的命令)从终端运行,它将执行。该脚本包含在下面,以防万一,但是,大多数内容都非常特定于我要运行的特定程序。我不知道如何进一步调试,也不知道为什么在 vi 中打开、保存和关闭的效果足以让脚本执行。 (例如,我已经检查了权限,并且在 vi 步骤之后这些权限没有改变。)任何关于如何进行的建议都非常感谢。

#!/bin/csh
#
bin2pipe -in /full/path/to/this/script/recon.spc -bad 0.0 -noswap \
-xN 1714 \
-xT 1714 \
-xFT Freq \
-xMODE Real \
-xSW 4184.570312 \
-xCAR 10.929523 \
-xOBS 800.130005 \
-xLAB 1H \
-yN 2048 \
-yT 2048 \
-yFT Freq \
-yMODE Real \
-ySW 1700.680054 \
-yCAR 125.728023 \
-yOBS 81.075996 \
-yLAB 1H \
-ndim 2 \
|nmrPipe -fn TP -auto \
|nmrPipe -fn REV \
|nmrPipe -fn TP -auto \
-out recon.spc.pipe.ft2 -ov -verb

【问题讨论】:

  • 你是如何从 Python 中调用它的?
  • 从 python 我把它称为subprocess.call(FileName),之前设置了文件权限,所以它可以用os.chmod(FileName, 0o755) 执行我注意到的一件事是在 vi 中打开、保存和关闭会增加 1 个字节文件大小(492 到 493 字节)。我不知道这是否重要,或者这个额外的字节被添加到哪里。
  • 您可以逐字节比较这两个文件,看看有什么不同。 换行符是等价的吗? Unicode 与 ascii?
  • 将 shebang 更改为 #!/bin/sh 可能无济于事,但出于其他原因强烈推荐。
  • 需要正确调用文件subprocess.call(["/bin/csh", "/full/path/to/file"])

标签: python shell unix vi csh


【解决方案1】:

如果这很有用,我使用 xxd(如上面的 cmets 中建议的 http://linuxcommand.org/man_pages/xxd1.html)将两个脚本文件(一个用 python 创建,一个手动编写)转换为十六进制

xxd script.txt output.txt

然后我将这两个文件的输出与diff 进行比较,可以在文件末尾看到一个额外的十六进制字符0a。这对应于换行符。如Why should text files end with a newline?VIM Disable Automatic Newline At End Of File 的详细说明,vi 在文件末尾添加一个换行符(如果没有的话)。这使脚本能够运行。最后没有换行符(我没有包含在 python 脚本中),脚本将无法运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2015-10-15
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多