使用 nohup 开始时如何将参数传递给 python 脚本

Bra*_*rad 5 python bash nohup

我需要使用 nohup 传递一个参数来使用 bash 启动一个 python 脚本,该参数有助于在我导入的脚本中定义一个常量。关于传递 args 有很多问题,但我还没有找到使用 nohup 的成功方法。

我的 bash 脚本的简化版本:

#!/bin/bash

BUCKET=$1
echo $BUCKET
script='/home/path/to/script/script.py'
echo "starting $script with nohup"
nohup /usr/bin/python $script $BUCKET &
Run Code Online (Sandbox Code Playgroud)

我正在导入的配置脚本的相关部分:

FLAG = sys.argv[0]
if FLAG == "b1": 
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket1" 
    AWS_SECRET_ACCESS_KEY = "secret"
elif FLAG == "b2": 
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket2"
    AWS_SECRET_ACCESS_KEY = "secret"
else:
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket3"
    AWS_SECRET_ACCESS_KEY = "secret"
Run Code Online (Sandbox Code Playgroud)

使用它的脚本:

from config import BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

#do stuff with the values.  
Run Code Online (Sandbox Code Playgroud)

坦率地说,由于我将 args 传递给 script.py,我不确定它们是否在导入脚本的范围内。也就是说,当我在不使用 nohup 的情况下采用类似的方法时,它会起作用。

aba*_*ert 6

一般来说,任何程序的参数向量都从程序本身开始,然后是它的所有参数和选项。根据语言的不同,程序可能是sys.argv[0]argv[0]$0或其他东西,但它基本上总是参数 #0。

每个程序的任务是运行另一个程序——比如nohup,就像 Python 解释器本身一样——通常会删除它自己和它自己的所有选项,并将命令行的其余部分提供给目标程序。

因此,nohup需要 aCOMMAND和零个或多个ARGS。在里面COMMAND,argv[0]将是COMMAND它自己(在这种情况下,'/usr/bin/python'),然后argv[1]是附加参数('/home/path/to/script/script.py'以及任何$BUCKET解析到的参数)。

接下来,Python 接受零个或多个选项、一个脚本和零个或多个该脚本的参数,并将脚本及其参数公开为sys.argv. 因此,在您的脚本中,sys.argv[0]将是'/home/path/to/script/script.py',并且sys.argv[1]将是$BUCKET解析为的任何内容。

bashPython 类似;$1将是 bash 包装器脚本的第一个参数($0将是脚本本身),依此类推。因此,sys.argv[1]在内部 Python 脚本中,第一个参数最终将传递给 bash 包装器脚本。

导入完全没有影响sys.argv。因此,在您的config模块和顶级脚本中,如果您import syssys.argv[1]将保存$1传递给 bash 包装器脚本的信息。

(在某些平台上,在某些情况下argv[0]可能没有完整的路径,甚至有可能是空的。但在这里是不相关的。你关心什么是最终的sys.argv[1],并且bashnohuppython都保证传递后保持不变。 )