【问题标题】:How to Call a Python Project from another Python project如何从另一个 Python 项目调用 Python 项目
【发布时间】:2021-06-14 05:03:03
【问题描述】:

我不是程序员,所以如果我的回复不准确或不太明白,请多多包涵。

我使用 PyCharm,它对我来说非常好用,python 脚本在 PyCharm 中被称为项目,我正在运行几个网络抓取脚本来检索互联网上的竞争对手价格。它们很简单,但工作得很好。为了完成这个过程,我必须独立调用每个脚本(每个竞争对手一个),等待它完成,然后我调用另一个,等等。我实际上可以同时调用或运行所有它们,但它在视觉上非常乱七八糟,有时会出现错误,一次运行一个并获得结果更简单,每次运行需要 10-15 分钟。

但我不能只是坐等他们完成。我尝试将它们合并到一个大型项目中,但这真的很混乱,因为每个网页都有细微差别,差异,我为每个页面使用不同的变量以允许差异,这种方式更简单。但这很耗时,基本上迫使我在运行它们时保持原状。

我正在尝试自动化该过程,并正在使用 TkInter 编写一个小项目,该项目将(理想情况下)调用或运行每个项目,一次一个,我还希望从每个项目中检索退出代码运行,以便我知道项目/脚本是否正常运行。

我已经对 TkInter 进行了半整理,并设法让按钮、时钟等启动并运行(我计划每天运行此脚本四次,大约每 3 小时一次)。我相信我可以做 GUI TkInter 位。

但我一直无法从另一个 PyCharm 项目调用/运行/导入 PyCharm 项目。这是我一直在尝试和使用的最后一次迭代(在按下 TkInter GUI 上的按钮时会调用它们:

  # create button, link it to run web price scraper program
    webscraperbutton = Button(self, text="Run", command=self.run_price_scraper)
    # place button at (400,100)
    webscraperbutton.place(x=200, y=100)

def run_price_scraper(self):
    # exec(open('/Users/manuel/PycharmProjects/PriceScraper/main.py').read())
    # os.system("/Users/manuel/PycharmProjects/PriceScraper/main.py")
    # subprocess.call('/Users/manuel/PycharmProjects/PriceScraper/main.py', shell=True)

它们都是#d,因为我一直在尝试各种组合,但到目前为止没有任何效果。

这是我得到的错误:

subprocess.call('/Users/manuel/PycharmProjects/PriceScraper/main.py', shell=True)

 from: can't read /var/mail/selenium
 from: can't read /var/mail/selenium.webdriver.chrome.options
 from: can't read /var/mail/selenium.webdriver.support.select
 from: can't read /var/mail/selenium.webdriver.common.by
 from: can't read /var/mail/selenium.webdriver.support.ui
 from: can't read /var/mail/selenium.webdriver.support
 /Users/manuel/PycharmProjects/PriceScraper/main.py: line 8: import: command not found
 /Users/manuel/PycharmProjects/PriceScraper/main.py: line 12: syntax error near unexpected token `('
 /Users/manuel/PycharmProjects/PriceScraper/main.py: line 12: `chrome_options = Options()'
From os.system("/Users/manuel/PycharmProjects/PriceScraper/main.py") same error

from: can't read /var/mail/selenium
from: can't read /var/mail/selenium.webdriver.chrome.options
from: can't read /var/mail/selenium.webdriver.support.select
from: can't read /var/mail/selenium.webdriver.common.by
from: can't read /var/mail/selenium.webdriver.support.ui
from: can't read /var/mail/selenium.webdriver.support
/Users/manuel/PycharmProjects/PriceScraper/main.py: line 8: import: command not found
/Users/manuel/PycharmProjects/PriceScraper/main.py: line 12: syntax error near unexpected token `('
/Users/manuel/PycharmProjects/PriceScraper/main.py: line 12: `chrome_options = Options()'


From exec(open('/Users/manuel/PycharmProjects/PriceScraper/main.py').read())

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 
1884, in __call__
return self.func(*args)
File "/Users/manuel/PycharmProjects/PYGUI/main.py", line 31, in run_stock_scraper
exec(open('/Users/manuel/PycharmProjects/PriceScraper/main.py').read())
File "<string>", line 402, in <module>
File "<string>", line 29, in site_login
NameError: name 'driver' is not defined

我怎样才能以简单的方式调用或运行另一个 PyCharm 项目,让它运行并获得退出代码?

我曾想过尝试从每个项目/脚本中创建一个 Python 应用程序,然后尝试调用一个应用程序,但我不知道这是否可行。

这里是行

# Import Libraries
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import pandas as pd


# Start the session
chrome_options = Options()

# Option to run Headless
# chrome_options.add_argument('--headless')

# Activate Chrome Selenium Driver
driver = webdriver.Chrome(executable_path='/Applications/System Utilities/chromedriver')
# Define maximum wait
wait = WebDriverWait(driver, 20)

这些是接下来的几行,我出于显而易见的原因编辑了一些东西,但就像我之前所说的,这一切都完美无缺

# Site Login Function
def site_login():
    # Login Data
    username = "XXXXXXXXXX"
    password = "XXXXXXXXXX"

    driver.get('https://XXXXXXXXXXXX.com/')
    # Wait for element to be present
    wait.until(ec.visibility_of_element_located((By.ID, "okta-signin-username")))
    # Send Username
    driver.find_element_by_id("okta-signin-username").send_keys(username)
    # print("username")
    # Wait for element to be present
    wait.until(ec.visibility_of_element_located((By.ID, "okta-signin-password")))
    # Send Password
    driver.find_element_by_id("okta-signin-password").send_keys(password)
    # print("password")
    # Wait for element to be present
    wait.until(ec.element_to_be_clickable((By.ID, "okta-signin-submit")))
    # Click Signin
    driver.find_element_by_id("okta-signin-submit").click()
    # print("Click")

【问题讨论】:

  • 仅仅为几个简单的脚本创建单独的项目听起来并不好。尝试循环运行每个脚本,或者您可能想要寻找结构化方法。
  • 从错误的角度来看,问题出在脚本本身,而不是您如何调用它们
  • 但它们在独立调用时工作得很好
  • 我可能完全错了,但我有一种感觉,它与 pycharm 如何设置环境而不是我如何调用它们有关,在我看来它不知道如何运行单独调用时运行良好的脚本或项目。我还尝试查看解释器等,但一切看起来都很好。不过可能是错的!!!
  • 请编辑问题以包含 PriceScraper/main.py 的前 12 行左右,这可能会给我关于问题所在的线索

标签: python python-3.x selenium tkinter pycharm


【解决方案1】:

至于子进程,您是否尝试过明确定义文件应由python启动,例如subprocess.run(['python3', '/Users/manuel/PycharmProjects/PriceScraper/main.py'], shell=True)

库子进程参考:https://docs.python.org/3/library/subprocess.html

一些例子:https://www.programcreek.com/python/example/50/subprocess.Popenhttps://www.programcreek.com/python/example/50/subprocess.run

【讨论】:

  • 不,我没有下次尝试,谢谢,实际上听起来它可以工作,我认为 pycharm 是阻止我调用其他项目的原因,我一直在指责 pycharm,无论如何都会报告怎么样,我刚刚做了,我在 macos 上得到了沙滩球,顺便说一句,我在 Big Sur 工作,如果有什么不同的话。我会让它“思考”一会儿,但至少它没有崩溃,它被卡住了
  • 为了防止在耗时任务上出现“沙滩球”,您可能需要使用 subprocess.Popen 代替 subprocess.run:subprocess.run 是同步/阻塞的,而 subprocess.Popen 是异步/非阻塞。请检查前面提到的链接以获取更多详细信息。要从子进程获得响应(例如,随后启动另一个子进程),您应该能够使用 event generate 将事件注入主事件循环/根窗口。我也在 Big Sur,使用 tkinter 的 PySimpleGUI 包装器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
相关资源
最近更新 更多