我有两个Python字典,我想编写一个返回这两个字典的表达式,合并.update()如果它返回结果而不是就地修改dict,那么该方法将是我需要的.
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = x.update(y)
>>> print(z)
None
>>> x
{'a': 1, 'b': 10, 'c': 11}
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得最终合并的词典z,不是x吗?
(要清楚的是,最后一次胜利的冲突处理dict.update()也是我正在寻找的.)
当需要连接多个目录时,如在可执行搜索路径中,存在与os相关的分隔符.对于Windows来说';',对于Linux来说就是这样':'.Python中是否有一种方法可以分割哪个字符?
在讨论这个问题时如何使用python找出我的python路径?,建议os.sep会这样做.答案是错误的,因为它是目录或文件名组件的分隔符,等同于'\\'或'/'.
我对subprocess使用时如何搜索可执行文件感到困惑Popen().如果给定子进程的绝对路径,它可以工作,但我正在尝试使用相对路径.我发现如果我设置环境变量PYTHONPATH然后我可以从该路径获得导入的模块,并且PYTHONPATH存在sys.path,但它似乎没有帮助的行为subprocess.Popen.我也尝试过编辑sitecustomize.py添加PYTHONPATH 的文件os.environ,就像这样
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
Run Code Online (Sandbox Code Playgroud)
并且验证了在启动python时,无论是交互式地,使用ipython,还是通过从命令行运行脚本,PYTHONPATH都成功出现os.environ.但是,subrocess.Popen 仍然不在那里搜索可执行文件.如果没有env指定kwarg ,我认为它应该继承父母的环境?接下来我尝试env明确地给出,首先通过制作副本,os.getenv然后仅仅通过给予env={'PATH': '/explicit/path/to/search/from'},它仍然找不到可执行文件.现在我很难过.
希望一个例子可以帮助我更清楚地解释我的问题:
/ dir/subdir1/some_executable
/dir/subdir2/some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], …Run Code Online (Sandbox Code Playgroud) 我在调用时设置环境变量时遇到问题subprocess.Popen.环境变量似乎没有设置.有关如何为Python命令行调用正确设置环境变量的任何建议?
我的目标是运行一个脚本,该脚本使用根据我的Python代码确定的环境变量:
d = dict(os.environ)
d["TEST_VARIABLE"] = str(1234)
subprocess.Popen('/usr/bin/mybinary', env=d).wait()
Run Code Online (Sandbox Code Playgroud)
但脚本的反应就像从未设置变量一样
这是我尝试使用Python的交互式解释器进行测试:
d = dict(os.environ)
d["TEST_VARIABLE"] = str(1234)
subprocess.Popen(['/bin/echo', '$TEST_VARIABLE'], env=d).wait()
Run Code Online (Sandbox Code Playgroud)
输出是:
"$TEST_VARIABLE"
0
Run Code Online (Sandbox Code Playgroud)
我认为env=d应该为子进程设置环境,但显然没有.有关如何纠正此问题的任何建议?
当我.exe用Python 调用外部程序时,如何printf从.exe应用程序获取输出并将其打印到我的Python IDE中?
我曾经安装并做:
$ sudo yum install -y postgresql94-server postgresql94
$ pg_dump -h name-of-db.us-east-1.rds.amazonaws.com -U user dbName > dump
Run Code Online (Sandbox Code Playgroud)
在RDS升级到9.5.2后,我得到了这个:
pg_dump: server version: 9.5.2; pg_dump version: 9.4.5
pg_dump: aborting because of server version mismatch
Run Code Online (Sandbox Code Playgroud)
我找不到适合Amazon Linux的软件包
这对我没有帮助:http://tecadmin.net/install-postgresql-9-5-on-centos/
你能?
我已经阅读了多篇帖子和许多文章,详细说明了cron作业中的scipts需要保持在脚本本身内部运行所必需的环境变量,因为在cron中打开了shell.我的情况是独特的,因为我的路径变量都是按照讨论的方式设置的,这反过来会使用subprocess.call ()成功调用pysaunter python egg ,但它似乎从那里分解.这导致整个过程在cron作业中中断.
为清楚起见,以下是我所指的步骤:
1) cronjob calls run_test.py -n foo
2) run_test.py sets the environment variables correctly
(cur_shell_path=sys.path (converted to proper path string, not shown here)
my_env= os.environ.copy()
my_env["PATH"] = my_env["PATH"] + cur_shell_path)
3) run_test.py calls subprocess.call("pysaunter -m foo -v", env=my_env, shell=True)
Run Code Online (Sandbox Code Playgroud)
步骤3的输出显示它正在找到egg并成功开始从pysaunter加载必要的模块,但是当它试图找到用于修改pysaunter的目录时它会中断.错误如下:
ImportError: no module named helpers
Run Code Online (Sandbox Code Playgroud)
我曾多次尝试将此路径添加到环境中,但它似乎永远不会找到包含helpers.py的目录.pysaunter -m foo -v从交互式shell调用时,该命令正常工作.
我在pysaunter上找不到多少帮助,所以我认为这里过多的pysaunter细节是不必要的.如果您了解更多有关pysaunter的信息,请告知我们您是否需要更多信息.我不知道该分享什么.
我还阅读了很多帖子,讨论了通过编辑.profile/.bash_profile来改变shell默认行为的能力.我试图找到一个可以使我的路径变量全局可访问的地方,但我找不到任何东西.我不确定这是怎么做的,它可以解决我的问题,所以如果你对此有所了解,请告诉我.
最后说明,这是在Mac 10.7.5上运行的.
我正在尝试使用 python 脚本中的以下代码从 python 生成一个子进程:
p = subprocess.Popen(['./appleseed.cli', '--version'])
Run Code Online (Sandbox Code Playgroud)
问题是该命令依赖于共享库,因此出现以下错误
./appleseed.cli: error while loading shared libraries: libappleseed.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我在系统中有主要的二进制文件,PATH也有 lib ,LD_LIBRARY_PATH但这似乎没有帮助。这些设置在~/.bash_profile.
有趣的是,如果我在交互式 python 会话中运行相同的代码,它也可以工作,同时也将命令指定为appleseed.cli没有./工作。
我正在运行 ubuntu 和 python 2.7
这是我正在使用的完整 python 文件:
import argparse
import subprocess
def print_appleseed_version(args):
p = subprocess.Popen(['./appleseed.cli', '--version'])
def main():
# Parse the command line.
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--tool-path", metavar="tool-path")
args = parser.parse_args()
print_appleseed_version(args)
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用该模块从 python 内部执行 bash 脚本subprocess。问题是这个 bash 脚本依赖于我的文件中设置的许多环境变量.bashrc。我想要的是 python 子进程能够准确复制启动终端窗口时设置的环境。到目前为止我尝试过:
p = subprocess.Popen(args=['my-script.sh', '--additional_args'], stdout=subprocess.PIPE, env=os.environ.copy(), shell=True)
output_buffer, return_code = p.communicate()
Run Code Online (Sandbox Code Playgroud)
但后来在某处读到,即使在执行完之后shell=True,.bashrc文件仍然没有加载,我应该尝试这样的事情:
p = subprocess.Popen(args=['/bin/bash', '-i', '-c', 'my_script.sh', '--additional_args'], stdout=subprocess.PIPE)
output_buffer, return_code = p.communicate()
Run Code Online (Sandbox Code Playgroud)
但是通过这个函数调用,我得到这个错误:
tput: No value for $TERM and no -T specified
bash: cannot set terminal process group (2071): Inappropriate ioctl for device
bash: no job control in this shell
Run Code Online (Sandbox Code Playgroud) 我有一个 Python 3.6 脚本,它使用子进程调用第三方工具。
main_script.py:
#!/usr/bin/env python
import subprocess
result = subprocess.run(['third-party-tool', '-arg1'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
问题是,main_script.py必须从虚拟环境中运行,并且third-party-tool必须从任何虚拟环境中运行。
我对此了解不多third-party-tool,只知道它在我的道路上。当我有一个活动的虚拟环境时调用它会导致它堵塞并稍后抛出异常。我不知道它是否使用默认的 python 二进制文件,或者它启动自己的虚拟环境并在那里执行操作。它不是一个 Python 脚本,但显然以某种方式调用一个脚本。
如何告诉子进程退出虚拟环境并在默认 shell 环境中运行命令?
我研究过几个类似的问题:
third-party-tool不是Python脚本(我相信它是bash)。我正在尝试从 python 脚本运行 Maven 项目。我已经安装了 apache maven。运行命令:mvn exec:java -D"exec.mainClass"="org.matsim.project.RunMatsim"从终端在 pom.xml 所在的项目文件夹中,不会产生错误并且项目运行正常。
但是当从我的 python 脚本运行以下代码时
import subprocess as sp
def execute(cmd):
popen = sp.Popen(cmd, stdout=sp.PIPE, universal_newlines=True,shell=True)
for stdout_line in iter(popen.stdout.readline, ""):
yield stdout_line
popen.stdout.close()
return_code = popen.wait()
if return_code:
raise sp.CalledProcessError(return_code, cmd)
for path in execute(["mvn", "exec:java" ,'-D"exec.mainClass"="org.matsim.project.MatsimRun"']):
print(path, end="")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
[错误] 没有为此构建指定目标。您必须以 : 或 :[:]: 格式指定有效的生命周期阶段或目标。可用的生命周期阶段有:验证、初始化、生成源、处理源、生成资源、处理资源、编译、处理类、生成测试源、处理测试源、生成测试资源、处理-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify`
为什么会这样?可能有什么问题?
两种情况(终端、python 脚本)发生的警告相同。
python ×9
subprocess ×4
shell ×3
environment ×2
amazon-ec2 ×1
bash ×1
cron ×1
cron-task ×1
crontab ×1
dictionary ×1
dll ×1
executable ×1
ide ×1
java ×1
linux ×1
maven ×1
merge ×1
path ×1
popen ×1
postgresql ×1
python-2.7 ×1
python-3.x ×1
rds ×1
redirect ×1
virtual ×1