首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python 3中使用subprocess.check_call运行Oracle

在python 3中使用subprocess.check_call运行Oracle
EN

Stack Overflow用户
提问于 2020-08-12 15:32:14
回答 1查看 205关注 0票数 0

我希望运行Oracle来在静默模式下创建数据库。我想通过Python脚本运行的命令如下:

代码语言:javascript
运行
复制
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName testdb -sid testdb -createAsContainerDatabase false -emConfiguration NONE -datafileDestination /u01/data/oracle/testdb/db_files -storageType FS -characterSet AL32UTF8 -totalMemory 2048 -recoveryAreaDestination /u01/app/oracle/fast_recovery_area

如果我直接从bash控制台运行该命令,它将完美地运行。现在,我想将它修改为从python脚本中运行,因此我做了以下操作:

代码语言:javascript
运行
复制
subprocess.check_call(['dbca', '-silent', '-createDatabase', '-templateName', 'General_Purpose.dbc', '-gdbName', gdbName, '-sid', sid, '-createAsContainerDatabase', 'false', '-emConfiguration', 'NONE', '-datafileDestination', dfDest, '-storageType', storageType, '-characterSet', 'AL32UTF8', '-totalMemory', totalMemory, '-recoveryAreaDestination', recoAreaDest])

并不是所有的参数都有单引号,这是因为我将一些变量作为参数传递。我的变量如下:

代码语言:javascript
运行
复制
#### VARIABLES ####
gdbName = ""
sid = ""
#dfDest = ""
storageType = "FS"
totalMemory = "2048"
recoAreaDest = oracle_base + "/fast_recovery_area"

#### USER INPUTS ####
while gdbName == "":
    gdbName = input("\n" + "Global DB name: ")
while sid == "":
    sid = input("SID: ")
dfDest = "/u01/data/oracle/" + sid + "/db_files"
dfDest = input("Datafile destination [" + dfDest + "]: ")
storageType = input("Storage type [" + storageType + "]: ")
totalMemory = input("Total Memory (in MB) [" + totalMemory + "]: ")
recoAreaDest = input("Fast recover area [" + recoAreaDest + "]: ")

因此,当我运行我的脚本时,会发生以下错误:

代码语言:javascript
运行
复制
[oracle@dataguard-test-primary ~]$ ./oracle_silent_install.py

1. Install Software
2. Create Database
     Option: 2


Oracle Database Creation script
Please enter the required info...


Global DB name: d
SID: d
Datafile destination [/u01/data/oracle/d/db_files]:
Storage type [FS]:
Total Memory (in MB) [2048]:
Fast recover area [/u01/app/oracle/fast_recovery_area]:
java.lang.NullPointerException
        at oracle.install.commons.swing.StandardDialog$ErrorDialogShowTask.call(StandardDialog.java:567)
        at oracle.install.commons.swing.StandardDialog$ErrorDialogShowTask.call(StandardDialog.java:516)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
        at java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:709)
        at java.awt.EventQueue$3.run(EventQueue.java:703)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
[oracle@dataguard-test-primary ~]$
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-13 14:06:49

解决了。

在用户输入部分,当尝试单击' Enter‘来选择默认值时,变量将被替换为null值,因为它没有读取任何内容,因此我在每个用户输入后添加了一个if,以验证用户是否刚刚按Enter,然后再次使用默认值填充变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63379911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档