【问题标题】:Running a subprocess bash script from Python in the scripts current directory在脚本当前目录中从 Python 运行子进程 bash 脚本
【发布时间】:2013-06-26 08:15:52
【问题描述】:

我希望在 python 脚本的子目录中运行 bash 脚本。这个 bash 脚本应该像在当前目录中一样执行它的所有操作。除了将目录作为参数传递并使用它来指导所有调用之外,还有什么方法可以做到这一点?

基本上是这样的

for i in range(1,100):
     subprocess.call(['/some%s/task.sh' % i, arg1])

脚本的内容与 some%s 目录中的文件一起使用。

【问题讨论】:

    标签: python shell directory subprocess


    【解决方案1】:

    subprocess.callcwd 关键字参数:

    for i in xrange(1, 100):
        subprocess.call(["./task.sh", arg1], cwd=("/some%d" % i))
    

    (仅隐式记录:“完整的函数签名与 Popen 构造函数的签名相同 - 此函数将所有提供的参数直接传递到该接口。”cwdPopen 中列出。 )

    【讨论】:

    • OPs 问题包括:“除了将目录作为参数传递并使用它来引导所有调用之外,还有什么方法可以做到这一点”,您的回答正是他们不希望做的事情!
    • @SteveBarnes:我读到它的意思是“脚本的一个参数”。这是在 Python 中执行此操作的正确方法。
    • 你可以使用["./task.sh", arg1]路径是相对于cwd的
    • @J.F.Sebastian:对。我认为这需要shell=True,但它不需要。
    【解决方案2】:

    是的,

    就在您的循环之前以编程方式保存当前工作目录并将当前工作目录更改为 /some%s 在 subprocess.call 之前,然后在完成后将其设置回原始值。

    import os
    Orig = os.path.abspath('.')
    for i in range(1,100):
        os.chdir('/some%s' % i)
        subprocess.call(['./task.sh' % i, arg1])
    os.chdir(Orig)
    

    【讨论】:

    • 为了可靠性你应该添加一些 try: except 控件以确保目录和脚本都存在。
    • chdir()中删除test.sh,否则调用会失败。
    • 这是不可靠的;异常将永久更改目录。它也不必要地复杂。
    猜你喜欢
    • 2023-01-12
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多