簡體   English   中英

在 python 3 中使用 subprocess.check_call 運行 Oracle DBCA

[英]Run Oracle DBCA with subprocess.check_call in python 3

我想運行 Oracle DBCA 在靜默模式下創建數據庫。 我想通過 Python 腳本運行的命令如下:

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 腳本運行,所以我做了以下事情:

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])

並非所有 arguments 都有單引號,這是因為我將一些變量作為 arguments 傳遞。 我的變量如下:

#### 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 + "]: ")

因此,當我運行我的腳本時,會發生以下錯誤:

[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 ~]$

解決了。

在用戶輸入部分,當嘗試點擊“輸入”來選擇默認值時,變量被替換為值null因為它什么也沒讀,所以我在每個用戶輸入后添加了一個if來驗證用戶是否剛剛點擊輸入然后用默認值再次填充變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM