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

时间:2013-08-01 21:57:17

标签: python bash nohup

我需要使用nohup使用bash启动一个python脚本,传递一个arg,它有助于在我导入的脚本中定义一个常量。关于传递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 &

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

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"

使用它的脚本:

from config import BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

#do stuff with the values.  

坦率地说,因为我将args传递给了script.py,所以我不相信它们会进入导入脚本的范围。也就是说,当我采用类似的方法而不使用nohup时,它可行。

2 个答案:

答案 0 :(得分:4)

通常,任何程序的参数向量都以程序本身开头,然后是所有参数和选项。根据语言的不同,该计划可能是sys.argv[0]argv[0]$0或其他内容,但它基本上始终是参数#0。

每个程序的工作是运行另一个类似nohup的程序,并且像Python解释器本身一样 - 通常会丢弃自身及其所有选项,并为目标程序提供命令行的其余部分。 / p>

因此,nohup需要COMMAND和零或更多ARGS。在COMMAND里面,argv[0]本身就是COMMAND(在这种情况下,'/usr/bin/python'),argv[1]及更高版本将是其他参数({{1}无论'/home/path/to/script/script.py'解决了什么。)

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

$BUCKET的工作方式与Python类似; bash将是bash包装器脚本的第一个参数($1将是脚本本身),依此类推。因此,内部Python脚本中的$0将最终获得传递给bash包装器脚本的第一个参数。

导入根本不会影响sys.argv[1]。因此,在sys.argv模块和顶级脚本中,如果configimport syssys.argv[1]传递给bash包装器脚本。

(在某些平台上,在某些情况下$1可能没有完整的路径,甚至可能是空的。但这与此无关。你关心的是最终的argv[0],并且sys.argv[1]bashnohup都可以保证不受影响。)

答案 1 :(得分:0)

nohup python3 -u ./train.py --dataset dataset_directory/ --model model_output_directory > output.log &

这里我用python3执行train.py文件,然后-u用于忽略缓冲并在不存储的情况下显示日志,并使用参数样式和 model_output_directory指定我的 dataset_directory / strong>,然后大于符号(>)

然后将日志存储在 output.log 中,并最后使用()符号

终止此过程

ps ax | grep train

然后记下process_ID

sudo kill -9 Process_ID