相关疑难解决方法(0)

从subprocess.Popen调用"source"命令

我有一个.sh脚本,我打电话给source the_script.sh.定期打电话很好.但是,我试图通过我的python脚本调用它subprocess.Popen.

从Popen调用它,我在以下两个场景调用中遇到以下错误:

foo = subprocess.Popen("source the_script.sh")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory


>>> foo = subprocess.Popen("source the_script.sh", shell = True)
>>> /bin/sh: source: not found
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?为什么我不能从Popen中调用"source",当我可以在python之外?

python unix popen

32
推荐指数
4
解决办法
4万
查看次数

"subprocess.Popen" - 检查成功和错误

我想检查子进程是否已成功执行或失败.目前我已经提出了一个解决方案,但我不确定它是否正确可靠.是否保证每个进程仅向stderr输出其错误stdout:

注意:我对重定向/打印输出不感兴趣.我知道该怎么做.

pipe = subprocess.Popen(command,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE,
                                universal_newlines=True)

if "" == pipe.stdout.readline():
    print("Success")
    self.isCommandExectutionSuccessful = True

if not "" == pipe.stderr.readline():
    print("Error")
    self.isCommandExectutionSuccessful = True
Run Code Online (Sandbox Code Playgroud)

或者:

   if "" == pipe.stdout.readline():
       print("Success")
       self.isCommandExectutionSuccessful = True
   else:
       print("Error")
       self.isCommandExectutionSuccessful = False
Run Code Online (Sandbox Code Playgroud)

和:

   if not "" == pipe.stderr.readline():
       print("Success")
       self.isCommandExectutionSuccessful = True
   else:
       print("Error")
       self.isCommandExectutionSuccessful = False
Run Code Online (Sandbox Code Playgroud)

python subprocess stdout stderr python-3.x

25
推荐指数
2
解决办法
5万
查看次数

如何使用call/Popen继承环境变量来调用子进程

首先,对我所确定的显而易见的道歉是我对bash,shell和子进程的基本理解.

我正在尝试使用Python来自动调用一个名为Freesurfer的程序(实际上,我正在调用的子程序称为recon-all.)

如果我直接在命令行执行此操作,我将"源"一个名为mySetUpFreeSurfer.sh的脚本,除了设置三个环境变量之外什么都不做,然后"源"另一个脚本FreeSurferEnv.sh.FreesurferEnv.sh在我看来并没有做任何事情,只是设置了很多环境变量并向终端回应了一些东西,但它比其他bash脚本更复杂,所以我不确定.

这就是我现在所拥有的:

from subprocess import Popen, PIPE, call, check_output
import os

root = "/media/foo/"

#I got this function from another Stack Overflow question.

def source(script, update=1):
    pipe = Popen(". %s; env" % script, stdout=PIPE, shell=True)
    data = pipe.communicate()[0]
    env = dict((line.split("=", 1) for line in data.splitlines()))
    if update:
        os.environ.update(env)
    return env

source('~/scripts/mySetUpFreeSurfer.sh')
source('/usr/local/freesurfer/FreeSurferEnv.sh')

for sub_dir in os.listdir(root):
    sub = "s" + sub_dir[0:4]
    anat_dir = os.path.join(root, sub_dir, "anatomical")
    for directory in os.listdir(anat_dir):
        time_dir = os.path.join(anat_dir, directory)
        for d in …
Run Code Online (Sandbox Code Playgroud)

python bash shell subprocess environment-variables

12
推荐指数
2
解决办法
1万
查看次数

一个可以被python和shell读取的配置文件

我在同一文件夹中有python脚本和shell脚本,它们都需要配置.我目前有一个用于我的python脚本的config.py,但我想知道是否有可能有一个配置文件,可以很容易地读取python脚本和shell脚本.

任何人都可以给出一个最适合python和shell读取的配置文件格式的例子.

python bash shell configuration debian

6
推荐指数
1
解决办法
4489
查看次数

从shell脚本加载环境变量

我有一个文件,其中包含一些我想在python脚本中使用的环境变量

以下工作形成命令行

$ source myFile.sh
$ python ./myScript.py
Run Code Online (Sandbox Code Playgroud)

从python脚本里面我可以访问变量之类的

import os
os.getenv('myvariable')
Run Code Online (Sandbox Code Playgroud)

我如何从python脚本中获取shell脚本,然后访问变量?

python bash shell environment-variables

6
推荐指数
1
解决办法
6510
查看次数

Django部署到Elastic Beanstalk时看不到环境变量

我正在尝试在Elastic Beanstalk上设置Django / DRF应用程序,由于任何原因,Django都无法看到所需的环境变量。登录时,通过使用可以看到它们很好

$ eb ssh
$ cat /opt/python/current/env
Run Code Online (Sandbox Code Playgroud)

除了使用RDS的相对敏感的代码外,我还可以看到它们,只需使用即可$eb printenv

所有这些似乎已设置并正常工作。但是,Django喜欢在启动时立即读取环境,并且似乎尚未设置环境变量。我已经尝试过简单地插入print(os.environ)in settings.py,当我这样做时,我发现了一大堆不需要的环境变量,也没有'SUPERVISOR_GROUP_NAME': 'httpd'我自己设置的变量DJ_SECRET_KEY

此后,我更改了代码以报告加载设置时不存在特定环境变量的情况,并从最近一次运行中生成了以下代码:

[Wed Nov 23 15:56:38.164153 2016] [:error] [pid 15708] DJ_SECRET_KEY not in environment; falling back to hardcoded value.
[Wed Nov 23 15:56:38.189717 2016] [:error] [pid 15708] RDS_DB_NAME not in environment; falling back to sqlite
[Wed Nov 23 15:56:38.189751 2016] [:error] [pid 15708] AWS_STORAGE_BUCKET_NAME not in environment; falling back to local static storage.
Run Code Online (Sandbox Code Playgroud)

同样,这些变量是在设置中设置的,它们与EB给我的任何其他报告工具一起显示。它们只是没有设置时间,以便Django在启动和读取时读取它们settings.py

这 …

python django amazon-web-services django-rest-framework amazon-elastic-beanstalk

6
推荐指数
1
解决办法
1420
查看次数

AWS SSM Run Command 的环境变量

我将 AWS SSM Run Command 与 AWS-RunShellScript 文档结合使用,在 AWS Linux 1 实例上运行脚本。该脚本的一部分包括使用环境变量。当我自己运行脚本时,一切都很好。但是当我用SSM运行脚本时,它看不到环境变量。该变量需要传递给 Python 脚本。我最初尝试 os.environ['VARIABLE'] 没有效果。

我知道AWS SSM使用root权限,因此我在root ~/.bashrc文件中放置了一行导出变量的行,但它仍然看不到该变量。我自己运行root用户就可以看到。AWS SSM 是否无法使用环境变量,或者我没有正确导出它?如果不可能,我将尝试使用 AWS KMS 来存储我的变量。

~/.bashrc

export VARIABLE="VALUE"
Run Code Online (Sandbox Code Playgroud)

脚本文件

"$VARIABLE"
Run Code Online (Sandbox Code Playgroud)

安全性很重要,因此我不想只将变量存储在脚本中。

environment-variables amazon-web-services aws-ssm

1
推荐指数
1
解决办法
9034
查看次数