【问题标题】:unable to source bash file from python shell script [duplicate]无法从 python shell 脚本获取 bash 文件 [重复]
【发布时间】:2017-11-26 07:53:32
【问题描述】:

您好,我正在尝试从我的 pythons 脚本中获取文件源,例如 check.setup。 代码

import os
os.system("source /fullpathhere/check.setup")

它说找不到命令。令人惊讶的是,我可以直接从 shell 获取相同的文件。 check.setup 是 csh 文件。它正在采购其他 .csh 文件并设置一些环境变量我在这里看到的答案很少,但没有人可以解决这个问题。 PS:我尝试编写 bash 文件而不是 python。我也尝试使用 subprocess.Popen。问题仍然存在。 阿什什

【问题讨论】:

  • 我不确定这是否正确(因此评论不回答),但我听说有时source 实际上是. 的别名。看看. /fullpathhere/check.setup 是否可以作为您的命令使用可能是值得的。
  • 您机器上的默认外壳是什么?使用echo $SHELL 进行查看,并首先在您的控制台中直接在source /fullpath/check.setup 上测试此命令以查看结果。
  • 来源和 .是内置的 shell 命令,而不是你可以像这样执行的东西。但即使你可以,也没有任何意义,因为 os.system 会生成一个子 shell:在该子 shell 中设置的任何环境变量都会在命令返回时退出时立即丢失。
  • @Delioth 我试过 {. /fullpathhere/check.setup)。这是行不通的。同样的错误
  • @gkegoux 它的 tcsh。道歉,但我不明白你的建议。你想让我用 Tcsh 写脚本吗?我试过 bash 它给出了相同的结果。

标签: python bash python-2.7 shell tcsh


【解决方案1】:

使用弹出

subprocess.Popen('source ./fullpathhere/check.setup', shell=True)

【讨论】:

  • 嘿,我用过 Popen。 (有点)。从子流程导入调用。然后调用('source ./fullpath/check.setup', shell= True)。它没有用。同样的问题
  • source 是一个bashism;要在 POSIX sh 中工作,它需要是 .
  • 尽管此时使用source. 而不是subprocess.Popen(['sh', './fullpathhere/check.setup'])(如果愿意,可以替换为替代解释器)绝对没有任何好处 shell 论据。
【解决方案2】:

为什么不将您的帖子标记为 csh,即使您在问题中明确提到了 csh....

没有可执行的namend source(你可以通过输入bin/which source来验证它。好吧,你自己指出,这应该是由csh,但是如果你不告诉它,Python 怎么知道它需要调用 csh 呢?

我的系统上没有 csh,但如果我记得几十年前确实使用 csh 进行编程,你可以做类似的事情

os.system("csh -c fullpathhere/check.setup")

实际上,我还会指定 -f 标志来跳过 .cshrc,除非你真的需要它的来源。

【讨论】:

  • 鉴于system() 的实现方式,您是在告诉OP 运行sh -c "csh -c fullpathhere/check.setup"。这……真的很傻。
  • 感谢您对标签的建议。我现在加了。我无法准确找到 cshell。我试过这样做,但问题是我没有访问该文件的权限。我什至无权使用 chmod 给予许可。所以我从 python 脚本制作了另一个 csh 文件,我的 check.setup 就是从中获取的。在创建文件时,我可以授予使用 python 脚本制作的文件的权限。然后我从 python 执行了我的 csh 文件
  • @Charles Duffy:在这种情况下,Python 是否不够聪明,可以省略sh 进程(就像 Perl 在这种情况下所做的那样)?但即使创建了一个额外的 POSIX shell 进程来运行 C-Shell,我也不认为这很糟糕(考虑到使用 os.system 的便利性)。
  • 最大的成本是正确性,而不是便利性。调用 shell 意味着您的数据需要转义才能正确解析;调用两个 shell 意味着它需要被转义两次。调用 shell 意味着您很容易受到初始化时问题的影响,例如 shellshock。不,Python(谢天谢地!)不会试图变得聪明并在程序员背后做事。
  • @user1934428,如果您正在处理不受信任的数据,您不能只逃脱一次而不会遭受 shell 注入攻击。假设你试图传递一个名为/uploads/$(rm -rf ~)'$(rm -rf ~)'/uploads/' '/etc/passwd 的文件(后者由mkdir $'\' \'' 创建,前者由touch $'$(rm -rf ~)\'$(rm -rf ~)\' 创建)——如果你运行system("sh -c '/run/my/script " + filename + "'") 你会有尽管通过文本中的文字单引号进行了单层显式引用(因为文件名中的文字单引号结束了它们),但两者都是糟糕的一天。
猜你喜欢
  • 2019-10-31
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多