【问题标题】:Python: Changing terminal current directory and calling scriptPython:更改终端当前目录和调用脚本
【发布时间】:2015-02-17 19:04:37
【问题描述】:

一旦我检查了文件夹中是否存在特定文件,我想从 python 调用名为 nii-sdcme 的 bash 脚本。但在终端中调用此脚本之前,我想 cd 到特定目录。这可以在python中完成吗?

因此在终端中运行此脚本的步骤如下所示:

cd DICOM/  
nii_sdcme N

其中 N 是某个文件夹编号。例如:92

cd DICOM/  
nii_sdcme 92

有人可以指导我如何在 python 脚本中实现这一点吗?

非常感谢!

【问题讨论】:

  • How do I "cd" in python 的可能重复项
  • 你打算如何从 python 运行你的 shell 脚本?你想为整个 python 脚本或只是 shell 脚本切换到那个目录?
  • @EtanReisner 只是 shell 脚本

标签: python bash terminal


【解决方案1】:

最快的方法是使用os.chdir:

import os

if __name__ == "__main__":
    print "Current dir: %s" % os.getcwd()
    os.chdir('/tmp/')
    print "Current dir: %s" % os.getcwd()

调用时输出:

Current dir: /home/borrajax/Documents/Tests/StackOverflow
Current dir: /tmp

现在,您提到要在脚本中调用特定脚本 (nii-sdcme)。您可能会使用subprocess.Popen 来做到这一点。使用subprocess 模块提供的工具,您可以指定cwd 参数,以便名为“看到” 的脚本(更确切地说是可执行文件)将cwd 路径作为其运行目录。请注意,这会设置 cwd after 中指示的目录,该可执行文件被调用...我的意思是 Popen 需要找到可执行文件的路径 before 设置可执行文件的运行目录。假设您在/home/ 中,而nii-sdcme 脚本位于/tmp/

这个:

subprocess.Popen(['nii-sdcme'], cwd='/tmp/')

将失败,因为可执行文件不在$PATH 环境变量中定义的目录中。另一方面,这是:

subprocess.Popen(['/tmp/nii-sdcme'], cwd='/tmp/')

会成功。

来自subrprocess.Popen 文档:

如果 cwd 不是 None,则子目录的当前目录将更改为 cwd 在执行之前。注意这个目录不考虑 在搜索可执行文件时,你不能指定程序的 相对于 cwd 的路径。

编辑(根据 OP 对此问题的评论)

如果我改变 os.chdir(desired/path) 然后 cann subprocess.call('nii_sdcme %s' %a)

这将使nii_sdcme 也使用desired/path 作为运行目录。 os.chdir 更改当前进程(您当前的解释器)的路径。如果您随后调用您的nii_sdcme 可执行文件而不指定cwd 参数,则生成的子进程将使用父进程的当前目录作为当前目录。

(!) 注意:即使您通过os.chdir 更改可执行文件的当前目录,您仍然需要提供nii_sdcme 可执行文件的完整路径(除非nii_sdcme 位于指定的目录之一中$PATH 环境变量)

【讨论】:

  • 如果我这样做 os.chdir(desired/path) 然后调用 subprocess.call('nii_sdcme %s' %a)
  • 谢谢@BorrajaX!这对我有帮助。
  • 很高兴我能帮上忙。 :-) 玩得开心编码!
  • :我尝试了以下语法并收到以下错误:os.chdir('/dicom/1013/0007') subprocess.Popen(['nii_mdir_sdcme %s %s' %a %s] )“错误:TypeError:格式字符串的参数不足”你能帮帮我吗?
  • @tryeverylanguage:这可能是另一个问题,但是您正在尝试创建一个格式化的字符串而不告诉它要格式化什么:这很好:print ("Hello: %s %s" % ('world', 7))" 但如果字符串期待 2 "%s " 并且你只通过了一个,然后你就会得到那个错误:print ("Hello: %s %s" % (7))"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2016-06-20
  • 2020-06-10
  • 2014-01-21
相关资源
最近更新 更多