Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在开始使用nohup时将参数传递给python脚本_Python_Bash_Nohup - Fatal编程技术网

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

如何在开始使用nohup时将参数传递给python脚本,python,bash,nohup,Python,Bash,Nohup,我需要用bash启动一个python脚本,使用nohup传递一个参数,该参数有助于在我导入的脚本中定义一个常量。关于传递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

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

坦率地说,由于我将参数传递给script.py,因此我不确定它们是否在导入脚本的范围内。也就是说,当我采取类似的方法而不使用nohup时,它是有效的

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

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

因此,接受一个
命令
和零个或多个
ARGS
。在该
命令中,
argv[0]
将是
命令本身(在本例中,
'/usr/bin/python'
),而
argv[1]
和更高版本将是附加参数(
'/home/path/to/script/script.py'
以及
$BUCKET
解析为的任何参数)

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

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

导入根本不影响
sys.argv
。因此,在
config
模块和顶级脚本中,如果
import sys
sys.argv[1]
将保存传递给bash包装器脚本的
$1

(在某些平台上,在某些情况下,
argv[0]
可能没有完整的路径,甚至可能是空的。但这与此处无关。您关心的是最终的
sys.argv[1]
,以及
bash
nohup
python
都保证不受影响地通过。)

在这里,我使用python3执行train.py文件,然后使用-u忽略缓冲并在运行中显示日志,而不进行存储,使用参数样式指定mydataset\u目录,然后使用model\u output\u目录然后大于symbol(>)

然后日志被存储在输出中。log最后使用(&)符号

终止此过程

ps ax | grep train
然后记下进程ID

sudo kill -9 Process_ID

我觉得奇怪的是,这会奏效
sys.argv[0]
是脚本名,不是第一个参数。答案非常清楚。非常感谢。我的错误基本上是不理解脚本是第一个arg。@Brad:啊,也许我可以解释得更好。伙计。但愿我能不止一次投票。非常感谢。非常有用
sudo kill -9 Process_ID